不兼容的模式在一些文件

學習如何解決不兼容的模式與磚鋪的文件。

寫的亞當Pavlacka

去年發表在:2022年5月31日

問題

火花工作失敗與讀取拚花時異常如下文件:

錯誤的SQL語句:SparkException:工作階段失敗而終止:任務20階段11227.0失敗了4次,最近的失敗:在舞台上失去了任務20.3 11227.0 (TID 868031、10.111.245.219執行人31):. lang。UnsupportedOperationException:方式org.apache.parquet.column.values.dictionary。PlainValuesDictionary PlainDoubleDictionary美元org.apache.parquet.column.Dictionary.decodeToLong (Dictionary.java: 52)

導致

java.lang.UnsupportedOperationException在這個例子中是由一個或多個拚花文件寫入鋪文件夾不兼容的模式。

解決方案

找到拚花用正確的模式文件和重寫。試著讀拚花與模式啟用合並數據集:

% scala spark.read。選項(“mergeSchema”,“真正的”).parquet(路徑)

% scala spark.conf.set (“spark.sql.parquet。合並Schema", "true") spark.read.parquet(path)

如果你有拚花的文件不兼容模式,上麵的代碼片段將輸出一個錯誤文件的名稱有錯誤的模式。

你也可以通過檢查兩個模式是否兼容合並方法。例如,假設您有兩種模式:

% scala org.apache.spark.sql.types進口。_ val struct1 =(新StructType)閥門(“a”,“int”,真的)閥門(“b”、“長”、假)val struct2 =(新StructType)閥門(“a”,“int”,真的)閥門(“b”、“長”、假)閥門(“c”,“時間戳”,真的)

然後你可以測試是否兼容:

% scala struct1.merge .treeString (struct2)

這將給你:

% scala res0:字符串= "根|——:整數(nullable = true) |——b:長(可空= false) | - c:時間戳(nullable = true)”

然而,如果struct2有以下不兼容的模式:

% scala val struct2 =(新StructType)閥門(“a”,“int”,真的)閥門(“b”,“弦”,假)

然後測試會給你以下SparkException:

org.apache.spark。SparkException:Failed to merge fields 'b' and 'b'. Failed to merge incompatible data types LongType and StringType