簡體   English   中英

使用 Databricks PySpark 從 Azure blob 存儲讀取多個 CSV 文件

[英]Reading multiple CSV files from Azure blob storage using Databricks PySpark

如何讀取具有不同列和文件路徑名的多個 CSV 文件並制作單個 dataframe。

這是一個只有 2 條路徑的示例。 但是有許多基於frnfilename的路徑。

"wasbs://containername@accountname.blob.core.windows.net/blobname/frn=xyz123/filename=file1/myfile34.csv"

"wasbs://containername@accountname.blob.core.windows.net/blobname/frn=abc567/filename=file2/myfile84.csv"


  1. 如果不存在值,則可以連接列並用 NA 填充。

  2. 根據路徑中提到的frn和文件名添加新列,以及 CSV 文件的相應 dataframe 文件。

  3. 在每個filename文件夾中,只有一個 CSV 存在,但每個frn文件夾下有多個filename文件夾。

例如:

myfile34.csv
   a  b frn      filename
0  3  4 xyz123   file1   
1  4  5 xyz123   file1
2  5  6 xyz123   file1

myfile84.csv    
   a  c frn      filename
0  1  3 abc567   file2
1  2  4 abc567   file2
2  3  5 abc567   file2

final df
  a b  c    frn      filename
0 3 4  NA   xyz123   file1  
1 4 5  NA   xyz123   file1  
2 5 6  NA   xyz123   file1  
3 1 NA 3    abc567   file2
4 2 NA 4    abc567   file2
5 3 NA 5.   abc567   file2


我試過這個:

import databricks.koalas as ks

path = "wasbs://containername@accountname.blob.core.windows.net/blobname/*/*/"
df = ks.read_csv(path, sep="','",header='infer')

但是我如何連接這些不同csv文件並創建新列(如frnfilename )?

我的建議/解決方法是使用parquet文件格式,因為它是模式演變案例的最佳格式之一。

當然,我不否認這一事實,我們可以在 pyspark 本身中再執行幾個步驟,這不會是直截了當的。

https://spark.apache.org/docs/latest/sql-data-sources-parquet.html#schema-merging

在此處輸入圖像描述

# Write both dataframes in same location, utilizing append, in parquet format.
df_1.write.mode('append').parquet('<URI_HERE>/out')
df_2.write.mode('append').parquet('<URI_HERE>/out')

# Note: mergeSchema will mege files with different structures, and merge common columns and fill Null values for non-intersecting columns.
spark.read.option('mergeSchema', True).parquet('<URI_HERE>/out').show()

在此處輸入圖像描述

快樂學習!

也許這個?

val myDFCsv = spark.read.format("csv")
   .option("sep","|")
   .option("inferSchema","true")
   .option("header","false")
   .load("mnt/rawdata/2019/01/01/client/ABC*.gz")

myDFCsv.show()
myDFCsv.head()
myDFCsv.count()


//////////////////////////////////////////
// If you also need to load the filename
val myDFCsv = spark.read.format("csv")
   .option("sep","|")
   .option("inferSchema","true")
   .option("header","false")
   .load("mnt/rawdata/2019/01/01/client/ABC*.gz")
   .withColumn("file_name",input_file_name())


myDFCsv.show(false)
myDFCsv.head()
myDFCsv.count()

暫無
暫無

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

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