允許空格和特殊字符與三角洲表嵌套列名稱

升級到磚運行時的10.2或更高版本和使用列映射模式允許空格和特殊字符的列名稱。

寫的shanmugavel.chandrakasu

去年發表在:2022年10月26日

問題

是常見的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 >”)
這篇文章有用嗎?