我正在使用Python Spark将数据帧写入blob中的文件夹,该文件夹将另存为零件文件:
df.write.format("json").save("/mnt/path/DataModel")
文件另存为:
我正在使用以下代码将其合并到一个文件中:
#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 仅具有最后一部分文件数据,而没有全部数据 零件文件。
答案 0 :(得分:1)
我看到您只想将这些文件的内容合并到一个文件中,但是由于对shutil.move
函数的描述如下图所示,其功能类似于Linux mv
,因此最后文件的内容将覆盖先前文件的内容。
通过代码写入多个文件的原因是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/')
作为参考,下图是我的结果。
对于您的另一个问题,使用PySpark读取零件文件就是将通配符路径传递给函数spark.read.json()
,如下所示。
spark.read.json('dbfs:/mnt/path/DataModel/part-*.json')