簡體   English   中英

Azure Databricks 將文件寫入 Azure Data Lake Gen 2

[英]Azure Databricks writing a file into Azure Data Lake Gen 2

我有一個 Azure Data Lake gen1 和一個 Azure Data Lake gen2(帶分層結構的 Blob 存儲),我正在嘗試創建一個 Databricks 筆記本(Scala),它讀取 2 個文件並將一個新文件寫回 Data Lake。 在 Gen1 和 Gen2 中,我遇到了相同的問題,其中我指定的輸出 csv 的文件名被保存為一個目錄,並且在該目錄中寫入 4 個文件“已提交、已啟動、_SUCCESS 和 part-00000-tid-

數據塊輸出截圖

對於我的生活,我無法弄清楚為什么要這樣做而不是將 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")

之所以創建包含多個文件的目錄,是因為每個分區都單獨保存並寫入數據湖。 要保存單個輸出文件,您需要重新分區數據幀

讓我們使用數據框 API

confKey = "fs.azure.account.key.srcAcctName.blob.core.windows.net"
secretKey = "==" #your secret key
spark.conf.set(confKey,secretKey)
blobUrl = 'wasbs://MyContainerName@srcAcctName.blob.core.windows.net'

合並您的數據框

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

更改文件名

files = dbutils.fs.ls(blobUrl + '/reports/')
output_file = [x for x in files if x.name.startswith("part-")]
dbutils.fs.mv(output_file[0].path, "%s/reports/testoutput.csv" % (blobUrl))

如果我正確理解您的需求,您只想將 Spark DataFrame 數據寫入到 Azure Data Lake 中名為testoutput.csv的單個 csv 文件,而不是包含一些分區文件的名為testoutput.csv的目錄。

所以你不能直接通過使用像DataFrameWriter.save這樣的 Spark 函數來實現它,因為實際上DataFrameWriter.save writer 基於 Azure Data Lake 將數據寫入 HDFS。 HDFS 將數據保存為名為 yours 的目錄和一些分區文件。 請參閱有關 HDFS 的一些文檔,例如The Hadoop FileSystem API Definition以了解它。

然后,根據我的經驗,您可以嘗試在 Scala 程序中使用 Azure Data Lake SDK for Jave 將數據從 DataFrame 作為單個文件直接寫入 Azure Data Lake。 您可以參考一些示例https://github.com/Azure-Samples?utf8=%E2%9C%93&q=data-lake&type=&language=java

嘗試這個 :

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM