我們處理每天josn文件的存儲位置,它將存檔一旦記錄添加到相應的表中。
source_location_path:“..../ mon = 5 /天= 1 / fld1”、“..../ mon = 5 /天= 1 / ..... fld2”“.... / mon = 5 /天= 1 / fldN”
閱讀:
df = spark.read。json(多行= True, source_location_path pathGlobFilter = f“* _ {file_name}”)
寫:
df.write.partitionBy(“月”).option .mode (“mergeSchema”、“true”)(“追加”).saveAsTable (table_name)
第一天文件內容:
{" id ":“1”,“名字”:“測試”,“檢查”:[{“id”:“1”,“價值”:“con1”、“評論”:“測試”},{" id ":“2”,“價值”:“con2”、“評論”:“測試”}],“細節”:[],“namedetail”: {“1 abc2efg”:“測試”的名字}}
第二天文件內容:
{" id ":“2”,“名字”:“test2”,“檢查”:[],“細節”:[],“namedetail”:{}}或{" id ":“2”,“名字”:“test2”,“檢查”:[],“細節”:[],“namedetail”: {“94 jut2jfn”:“測試人員”}}
問題1:當我們試圖附加到現有表我們得到的價值”“失敗的合並不兼容的數據類型。因為俊文件對應的複雜與原始列的值。
第二天文件以來空值的數據類型有改變。
為例:
第一天:列“檢查”是“結構體數組”——它有嵌套結構
第二天:“檢查”列數組”——因為列沒有任何記錄
問題2:天1 -“namedetail”列是Struct類型和值(“10 abc2efg”:“測試名稱”)
第二天:同一列“namedetail”還有另一個值(“94 jut2jfn”:“測試人員”)
所以它考慮到第二天“namedetail”作為一個新列列值。所以我們不能夠合並。
同樣,如果“namedetail”空記錄然後我們正麵臨著一個問題。
你能幫我處理數據類型不匹配和動態列變化?
謝謝,
香港
@Hare Krishnan突出顯示的問題可以很容易地使用.option處理(“mergeSchema”、“true”)的時候閱讀的所有文件。
示例代碼:
spark.read。選項(“mergeSchema”,“真正的”)。json(<文件路徑>、多行= True)
唯一的場景將無法處理如果在嵌套列類型並不相同。
示例文件1:
{" name ":“測試”,“檢查”:[{" id ": " 1 "},]}
示例文件2:
{“名稱”:“測試”,“檢查”:[{" id ": 1、},]}
超過2文件mergeSchema選項將失敗,因為“id”列在檢查有兩個不同類型的值:字符串(在文件1)和int(在文件2)。
處理這種情況下你需要編寫一些定製函數。