Azure Databricks将文件写入Azure Data Lake Gen 2

时间:2019-05-05 17:14:34

标签: scala azure azure-data-lake databricks azure-databricks

我有一个Azure Data Lake gen1和一个Azure Data Lake gen2(带层次结构的Blob存储),我正在尝试创建一个Databricks笔记本(Scala),该笔记本可以读取2个文件并将新文件写回到Data Lake中。在Gen1和Gen2中,我都遇到相同的问题,即我指定的输出csv的文件名被保存为目录,并且在该目录中正在写入4个文件“ committed started”。 ,_ SUCCESS和part-00000-tid-

databricks output screenshot

对于我的一生,我无法弄清楚为什么这样做,并且实际上没有将csv保存到该位置。 这是我编写的代码的示例。如果我在df_join数据帧上执行.show(),则它将输出正确的外观结果。但是.write无法正常工作。

val df_names = spark.read.option("header", "true").csv("/mnt/datalake/raw/names.csv")
val df_addresses = spark.read.option("header", "true").csv("/mnt/datalake/raw/addresses.csv")

val df_join = df_names.join(df_addresses, df_names.col("pk") === df_addresses.col("namepk"))


df_join.write
.format("com.databricks.spark.csv")
.option("header", "true")
.mode("overwrite")
.save("/mnt/datalake/reports/testoutput.csv")

3 个答案:

答案 0 :(得分:1)

如果我正确理解了您的需求,则只想将Spark DataFrame数据写入到名为testoutput.csv的单个csv文件到Azure Data Lake中,而不是写入包含某些分区文件的名为testoutput.csv的目录中。

因此您无法通过使用DataFrameWriter.save之类的这些Spark函数直接实现它,因为实际上数据帧编写器将数据写入基于Azure Data Lake的HDFS。 HDFS将数据保存为名为yours和一些分区文件的目录。请参阅The Hadoop FileSystem API Definition之类的有关HDFS的文档以了解它。

然后,根据我的经验,您可以尝试在Scala程序中使用适用于Jave的Azure Data Lake SDK将数据作为单独的文件直接从DataFrame写入Azure Data Lake。您可以参考一些示例https://github.com/Azure-Samples?utf8=%E2%9C%93&q=data-lake&type=&language=java

答案 1 :(得分:0)

之所以要创建包含多个文件的目录,是因为每个分区都被保存并分别写入数据湖。要保存单个输出文件,您需要重新划分数据框

df_join.coalesce(1)
.write
.format("com.databricks.spark.csv")
.option("header", "true")
.mode("overwrite")
.save("/mnt/datalake/reports/testoutput.csv")

答案 2 :(得分:0)

试试这个:

df_join.to_csv('/dbfs/mnt/....../df.csv', sep=',', header=True, index=False)