問題
是常見的JSON文件包含嵌套的結構體列。嵌套列名在JSON文件中可以有空間之間的名字。
當你使用Apache火花讀或寫JSON文件嵌套列名稱中使用空格,你得到一個AnalysisException錯誤消息。
例如,如果您試圖讀取JSON文件,評估DataFrame,然後寫出來一個增量表DBR 10.2或低於它返回一個錯誤。
% scala val df = spark.read.json (“< path-to-JSON-file >”) df.write.format .mode(“δ”)(“覆蓋”).save (“< path-to-delta-table >”)
預期的錯誤消息是可見的堆棧跟蹤。
stage_info.Accumulables AnalysisException:屬性名稱”。數失敗值中包含無效的字符(s),, {} () \ n \ t =”。請使用別名來重命名它。
導致
嵌套列名稱之一DataFrame包含空格,這是防止你寫輸出差值表。
解決方案
如果你的源文件是簡單的,你可以使用withColumnRenamed重命名多個列和刪除空間。但是,這很快就會複雜嵌套模式。
withColumn可用於壓平嵌套列和重命名現有列(空格)一個新列名稱(沒有空格)。在大型模式的情況下,壓扁的所有嵌套列DataFrame可以是一個冗長乏味的任務。
如果你的集群使用磚運行時的10.2或以上可以完全避免這個問題通過允許列映射模式。列映射模式以及允許使用空間,;{}()\ n \ t =表中的列名。
設置三角洲表的屬性delta.columnMapping.mode來的名字啟用列映射模式。
此示例代碼設置了一個三角洲能夠支持嵌套表列的名稱空間,但是它需要一個集群運行磚運行時的10.2或以上。
% scala進口io.delta.tables.DeltaTable val df = spark.read.json (“< path-to-JSON-file >”) DeltaTable.create () .addColumns df.schema .property(“三角洲。minReaderVersion”、“2”) .property(“三角洲。minWriterVersion”、“5”) .property (“delta.columnMapping。模式”、“名稱”).location (“< path-to-delta-table >”) . execute () df.write.format(“δ”).mode .save(“追加”)(“< path-to-delta-table >”)