从Azure Databricks中的Azure存储容器中读取文件并修改文件名

问题描述

我正在摄取大型XML文件并根据XML元素生成单独的JSON,我在天蓝色的数据块中使用SPARK-XML。 将JSON文件创建为的代码

commercialInfo
.write
.mode(SaveMode.Overwrite)
.json("/mnt/processed/" + "commercialInfo")

我能够提取XML元素节点并写入Azure存储容器。 在容器中创建一个文件夹,在该文件夹中,我们用guid命名而不使用文件名。

enter image description here

任何人都可以建议我们是否可以控制在容器中创建的文件名,即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"))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...