你好,
我有一個非標準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看起來像這樣:
我希望你能給我一些建議關於如何方法在磚和處理這些文件。
謝謝你的跟進。
從這個論壇我也'get任何答案,我可以直接使用,但它確實幫助我前進。
但是我還是找到了解決這個問題之後的研究主題。
最好的解決方案是編寫一個模式導入json文件之前,花了一些時間寫模式和以正確的格式,交貨
StructField(“數據”,
MapType (StringType (), StructType ([
StructField (“invoiceId LongType(),真的),
使用一個模式後,火花就能明白下麵的節點編號順序數據,是一個結構體類型,這是正確處理。
在json文件中定義的模式是正確的,可以使用火花爆炸結構節點上的操作“數據”
例:
從pyspark.sql。功能導入爆炸,上校
df1 = dfresult.select(爆炸(“數據”)
df2 = df1.select(“價值。*”)
最後我得到了所有數據歸一化表。
謝謝所有貢獻和努力的幫助。
@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看起來像這樣: