1 回答

TA貢獻1860條經驗 獲得超8個贊
使用 Spark 時,無法在單個列中混合使用不同的數據類型。
讀取 json 文件時,Spark 將嘗試推斷每列的數據類型(有關更多詳細信息,請參閱底部的注釋)。在這里,Spark認為是字符串類型并且是雙精度的。這可以通過讀取 json 文件并在數據幀上使用來確認。
這意味著數據是根據這些推斷的數據類型進行解析的。因此,Spark將嘗試解析為雙精度,但顯然會失敗。(對于它中的第二行,它的工作原理是,因為被推斷為字符串類型,因此是有效的輸入。col1col2printSchema""col1col1""
使用時,可以設置不同的模式。從文檔中,我們有:spark.read.json
mode -
允許在解析期間處理損壞記錄的模式。如果設置了“無”,則使用缺省值 。PERMISSIVE
PERMISSIVE:當它遇到損壞的記錄時,將格式錯誤的字符串放入由 columnNameOfCorruptRecord 配置的字段中,并將其他字段設置為 null。若要保留損壞的記錄,用戶可以在用戶定義的架構中設置名為 columnNameOfCorruptRecorcord 的字符串類型字段。如果架構沒有該字段,則會在分析過程中刪除損壞的記錄。推斷架構時,它會在輸出架構中隱式添加一個 columnNameOfCorruptRecord 字段。
DROPMALFORMED:忽略整個損壞的記錄。
FAILFAST:在遇到損壞的記錄時引發異常。
從上面,我們可以看到默認情況下使用模式,如果遇到損壞的記錄,則所有字段都設置為 。在這種情況下,就會發生這種情況。要進行確認,可以設置為 ,PERMISSIVEnullmodeFAILFAST
spark.read.json("my.json", mode='FAILFAST')
這將給出一個例外。
這可以通過不推斷數據類型并將所有內容讀取為字符串來解決。
spark.read.json("my.json", primitivesAsString='true')
注意:與其他源(如 csv 和 txt)相比,json 的架構推斷略有不同,請參閱此處。對于 json 文件,兩者都有特殊的處理來處理不區分兩者的 json 生成器。對于 csv 文件,具有空字符串的列仍會使整個列被推斷為字符串,但對于 json 而言,情況并非如此。""null""
作為旁注,替換為例如 in 將使推斷的列類型為字符串。"""5"col2
添加回答
舉報