[英]Read multiple json files from blob storage to dataframe using pyspark in databricks
[英]Reading multiple CSV files from Azure blob storage using Databricks PySpark
如何讀取具有不同列和文件路徑名的多個 CSV 文件並制作單個 dataframe。
這是一個只有 2 條路徑的示例。 但是有許多基於frn
和filename
的路徑。
"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"
如果不存在值,則可以連接列並用 NA 填充。
根據路徑中提到的frn
和文件名添加新列,以及 CSV 文件的相應 dataframe 文件。
在每個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
文件並創建新列(如frn
和filename
)?
我的建議/解決方法是使用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.