Azure数据块:如何读取零件文件并将其另存为一个文件以便Blob?

时间:2019-11-20 23:01:16

标签: python azure apache-spark databricks azure-databricks

我正在使用Python Spark将数据帧写入blob中的文件夹,该文件夹将另存为零件文件:

df.write.format("json").save("/mnt/path/DataModel")

文件另存为:

enter image description here

我正在使用以下代码将其合并到一个文件中:

#Read Part files
 path = glob.glob("/dbfs/mnt/path/DataModel/part-000*.json")  

#Move file to FinalData folder in blbo
    for file in path: 
          shutil.move(file,"/dbfs/mnt/path/FinalData/FinalData.json")
  

但是 FinalData.Json 仅具有最后一部分文件数据,而没有全部数据   零件文件。

1 个答案:

答案 0 :(得分:1)

我看到您只想将这些文件的内容合并到一个文件中,但是由于对shutil.move函数的描述如下图所示,其功能类似于Linux mv,因此最后文件的内容将覆盖先前文件的内容。

enter image description here

通过代码写入多个文件的原因是Spark在HDFS上运行,因此在HDFS上写入的128MB(HDFS部件文件大小)以上的数据将生成多个以part前缀命名的文件,请参阅到What is Small file problem in HDFS ?

一种满足您需要的解决方法是将PySpark数据框转换为Pandas数据框,然后使用pandas数据框功能to_json编写json文件。

这是我的示例代码。

df.toPandas().to_json('/dbfs/mnt/path/FinalData/FinalData.json')

然后检查文件是否存在。

import os
os.path.isfile('/dbfs/mnt/path/FinalData/FinalData.json')

dbutils.fs.ls('dbfs:/mnt/path/')

作为参考,下图是我的结果。

enter image description here

对于您的另一个问题,使用PySpark读取零件文件就是将通配符路径传递给函数spark.read.json(),如下所示。

spark.read.json('dbfs:/mnt/path/DataModel/part-*.json')