簡體   English   中英

在 azure blob 存儲中重命名 spark 輸出 csv

[英]Renaming spark output csv in azure blob storage

我有一個 Databricks 筆記本設置,其工作方式如下;

  • 到 Blob 存儲帳戶的 pyspark 連接詳細信息
  • 通過 spark dataframe 讀取文件
  • 轉換為熊貓 Df
  • pandas Df 數據建模
  • 轉換為火花 Df
  • 在單個文件中寫入 blob 存儲

我的問題是,您無法命名文件輸出文件,我需要一個靜態 csv 文件名。

有沒有辦法在pyspark中重命名它?

## Blob Storage account information
storage_account_name = ""
storage_account_access_key = ""

## File location and File type
file_location = "path/.blob.core.windows.net/Databricks_Files/input"
file_location_new = "path/.blob.core.windows.net/Databricks_Files/out"
file_type = "csv"

## Connection string to connect to blob storage
spark.conf.set(
  "fs.azure.account.key."+storage_account_name+".blob.core.windows.net",
  storage_account_access_key)

數據轉換后輸出文件

dfspark.coalesce(1).write.format('com.databricks.spark.csv') \
  .mode('overwrite').option("header", "true").save(file_location_new)

然后將文件寫為“part-00000-tid-336943946930983.....csv”

目標是擁有“Output.csv”

我看到的另一種方法只是在 python 中重新創建它,但在文檔中還沒有遇到如何將文件輸出回 blob 存儲的方法。

我知道從 Blob 存儲中檢索的方法是.get_blob_to_path via microsoft.docs

非常感謝這里的任何幫助。

Hadoop/Spark 會將每個分區的計算結果並行輸出到一個文件中,因此您會在您命名的Output/ HDFS 輸出路徑中看到許多part-<number>-....文件。

如果你想將一次計算的所有結果輸出到一個文件中,你可以通過命令hadoop fs -getmerge /output1/part* /output2/Output.csv合並它們,或者像使用coalesce(1) 1一樣將reduce進程數設置為1 coalesce(1)功能。

所以在你的場景中,你只需要調整這些函數的調用順序,讓coalease函數在save函數的前面被調用,如下。

dfspark.write.format('com.databricks.spark.csv') \
  .mode('overwrite').option("header", "true").coalesce(1).save(file_location_new)

coalescerepartition無助於將數據幀保存到 1 個正常命名的文件中。

我最終只是重命名了 1 個 csv 文件並刪除了帶有日志的文件夾:

def save_csv(df, location, filename):
  outputPath = os.path.join(location, filename + '_temp.csv')

  df.repartition(1).write.format("com.databricks.spark.csv").mode("overwrite").options(header="true", inferSchema="true").option("delimiter", "\t").save(outputPath)

  csv_files = os.listdir(os.path.join('/dbfs', outputPath))

  # moving the parquet-like temp csv file into normally named one
  for file in csv_files:
    if file[-4:] == '.csv':
      dbutils.fs.mv(os.path.join(outputPath,file) , os.path.join(location, filename))
      dbutils.fs.rm(outputPath, True)

# using save_csv
save_csv_location = 'mnt/.....'
save_csv(df, save_csv_location, 'name.csv')

暫無
暫無

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

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