问题描述
我正在摄取大型XML文件并根据XML元素生成单独的JSON,我在天蓝色的数据块中使用SPARK-XML。 将JSON文件创建为的代码
commercialInfo
.write
.mode(SaveMode.Overwrite)
.json("/mnt/processed/" + "commercialInfo")
我能够提取XML元素节点并写入Azure存储容器。 在容器中创建一个文件夹,在该文件夹中,我们用guid命名而不使用文件名。
任何人都可以建议我们是否可以控制在容器中创建的文件名,即part-0000变成有意义的名称,以便可以使用某些Azure Blob触发器读取它。
解决方法
不幸的是,无法使用标准的spark库来控制文件名,但是您可以使用Hadoop API来管理文件系统-将输出保存在临时目录中,然后将文件移动到请求的路径。
Spark使用Hadoop文件格式,该文件需要对数据进行分区-这就是为什么您有
part-0000
个文件的原因。
为了更改文件名,请尝试在代码中添加如下内容:
在Scala中,它看起来像:
import org.apache.hadoop.fs._
val fs = FileSystem.get(sc.hadoopConfiguration)
val file = fs.globStatus(new Path("path/file.csv/part*"))(0).getPath().getName()
fs.rename(new Path("csvDirectory/" + file),new Path("mydata.csv"))
fs.delete(new Path("mydata.csv-temp"),true)
OR
import org.apache.hadoop.fs._
val fs = FileSystem.get(sc.hadoopConfiguration)
fs.rename(new Path("csvDirectory/data.csv/part-0000"),new Path("csvDirectory/newData.csv"))