取消
顯示的結果
而不是尋找
你的意思是:

如何把非標準Json文件dataframe

斯蒂爾曼
新的貢獻者三世

你好,

我有一個非標準Json文件與一個嵌套文件結構問題。這是一個json文件的示例。

jsonfile = " "[{“成功”:真的,“numRows”: 2,“數據”:{" 58251 ":{“invoiceno”:“58251”,“名字”:“invoice1”、“companyId”:“1000”,“departmentId”:“1”,“線”:{" 40000 ":{“invoiceline”:“40000”,“productid”:“1”,“數量”:“10000”,“數量”:“7”},“40001”:{“invoiceline”:“40001”,“productid”:“2”,“數量”:“9000”,“數量”:“7”}}},“58252”:{“invoiceno”:“58252”,“名字”:“invoice34”、“companyId”:“1001”,“departmentId”:“2”,“線”:{" 40002 ":{“invoiceline”:“40002”,“productid”:“3”,“數量”:“7000”,“數量”:“6”},“40003”:{“invoiceline”:“40003”,“productid”:“2”,“數量”:“9000”,“數量”:“7”}}}}})”“熊貓作為pd df = pd.read_json導入(jsonfile)顯示(df)

這裏的問題是,使用的一些鍵為“58252”,而不是“id”:“58252”或空白值。有這樣的“數據”數組和數組“行”。所以我已經嚐試使用標準函數與json_normalize火花或爆炸,但它似乎並不使用這個特殊的json格式。

endgoal是得到一個dataframe看起來像這樣:

需要的格式後的dataframe處理json文件我希望你能給我一些建議關於如何方法在磚和處理這些文件。

1接受解決方案

接受的解決方案

斯蒂爾曼
新的貢獻者三世

謝謝你的跟進。

從這個論壇我也'get任何答案,我可以直接使用,但它確實幫助我前進。

但是我還是找到了解決這個問題之後的研究主題。

最好的解決方案是編寫一個模式導入json文件之前,花了一些時間寫模式和以正確的格式,交貨

StructField(“數據”,

MapType (StringType (), StructType ([

StructField (“invoiceId LongType(),真的),

使用一個模式後,火花就能明白下麵的節點編號順序數據,是一個結構體類型,這是正確處理。

在json文件中定義的模式是正確的,可以使用火花爆炸結構節點上的操作“數據”

例:

從pyspark.sql。功能導入爆炸,上校

df1 = dfresult.select(爆炸(“數據”)

df2 = df1.select(“價值。*”)

最後我得到了所有數據歸一化表。

謝謝所有貢獻和努力的幫助。

在原帖子查看解決方案

6個回答6

Hubert_Dudek1
尊敬的貢獻者三世

我包括示例代碼,以及筆記本源和截圖。

rddjson = sc.parallelize ([jsonfile]) df =(火花。讀取. json (rddjson) .select(“數據。*”))發票= spark.createDataFrame (df.rdd。flatMap(λx: [y y的x]))

image.png

Hubert_Dudek1
尊敬的貢獻者三世

因此在下一步可以做類似的事情

斯蒂爾曼
新的貢獻者三世

@Hubert杜德克,

非常感謝你的回答。幫助。我仍然w,

不知道如何保持數據之間的數據連接水平和“線”水平。

#我想保持參考invoiceno線。* = invoices.select闡述(“。*”、“invoiceno”) = spark.createDataFrame (dfl.rdd線。flatMap(λx: [y y的x])) #返回下麵的錯誤消息顯示(線)

我將筆記本與評論/ DBC文件問題。

Deepak_Bhutada
貢獻者三世

@stale stokkereit

您可以使用以下函數扁平結構體字段

進口pyspark.sql。函數作為F def flatten_df (nested_df): flat_cols = [c [0] nested_df c。dtypes如果c [1] [6] ! = ' struct '] nested_cols = [c [0] nested_df c。dtypes如果c [1] [6] = =] flat_df = nested_df“結構”。選擇(flat_cols + [F.col(數控+ '。' + c) .alias(數控+“_”+ c)的數控nested_cols nested_df.select的c(數控+”。*’).columns])返回flat_df

你的dataframe看起來像這樣:

圖像

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map