繁体   English   中英

使用 Databricks 将数据帧写入 Azure Blob 存储会生成一个空文件

[英]Writing dataframe to Azure Blob Storage using Databricks generates an empty file

在 Databricks 上,我有一项日常工作正在运行,它将数据帧写入 Azure Blob 存储上的 parquet 文件。 它会创建一个同名文件和一个文件夹。 但是,在我设置的目录上创建的文件是空的,并且有一个同名的文件夹,其中包含一个“随机名称”的镶木地板文件,用于存储数据框的内容。

empty_parquet_file random_name_parquet_file

我希望将镶木地板文件保存为 agg_DF.parquet,以便文件名保持不变,但 agg_DF.parquet 现在为空。 相反,看起来我需要进入文件夹并获取名称以.parquet结尾的任何文件,但我非常感谢有关如何执行此操作的任何帮助 或者是否有更好的方法在 Databricks 上执行此操作,以便 agg_DF.parquet 在保存在 Blob 存储上时不为空。

这是我在 Databricks 上的代码:

OUTPUT_PARQUET_FILENAME = 'agg_DF.parquet'
container_name = ‘xxxxx’
account_name = ‘yyyy’
output_path = f"wasbs://{container_name}@{account_name}.blob.core.windows.net/{OUTPUT_PARQUET_FILENAME}"

spark_DF = spark.createDataFrame(agg_df).repartition('blob_date')
spark_DF.write.parquet(output_path, mode="overwrite")

Spark 的工作方式是将文件拆分为部分文件,通过执行程序以分布式方式并行处理它。 因此,在写入您无法控制的名称且只有您可以控制的输出文件夹名称的数据时,您总是会在输出中获得一个零件文件

因此,总体而言,您遵循的过程是我建议使用 repartition/coalesce (1) 将其放入文件夹内的单个文件中,从该文件夹中获取 .parquet 文件使用 dbutils 移动它并删除该文件夹

下面是我用来执行相同活动的代码

df.coalesce(1).write.csv("/temp_path/","overwrite")
z=[ x.name for x in dbutils.fs.ls("/temp_path/") if x.name.endswith("csv")]
print(z)
if len(z)==1:
  print(z[0])
  dbutils.fs.mv("/temp_path/"+z[0],"/final_path/filename.parquet')
dbutils.fs.rm("/temp_path/",True)

替换 temp_path 和 final_path/filename.parquet

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM