某些文件中的模式不兼容

了解如何使用Databricks解決Parquet文件中不兼容的模式。

寫的亞當Pavlacka

最後發布時間:2022年5月31日

問題

Spark作業在讀取Parquet文件時失敗,出現如下異常:

SQL語句錯誤:SparkException: Job aborted due to stage failure: Task 20 in stage 11227.0 failed 4 times, most recent failure: Lost Task 20.3 in stage 11227.0 (TID 868031, 10.111.245.219, executor 31): java.lang.UnsupportedOperationException: org.apache.parquet. columns .values.dictionary. Error:PlainValuesDictionary PlainDoubleDictionary美元org.apache.parquet.column.Dictionary.decodeToLong (Dictionary.java: 52)

導致

java.lang.UnsupportedOperationException在這種情況下,是由一個或多個Parquet文件寫入到具有不兼容模式的Parquet文件夾所引起的。

解決方案

找到Parquet文件並用正確的模式重寫它們。嚐試在啟用模式合並的情況下讀取Parquet數據集:

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

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

如果您的Parquet文件具有不兼容的模式,那麼上麵的代碼片段將輸出一個錯誤,其中包含具有錯誤模式的文件的名稱。

方法,還可以檢查兩個模式是否兼容合並方法。例如,假設您有以下兩個模式:

% scala org.apache.spark.sql.types進口。_ val struct1 =(新StructType) .add("a", "int", true) .add("b", "long", false) val struct2 =(新StructType) .add("a", "int", true) .add("b", "long", false) .add("c", "timestamp", true)

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

% scala struct1.merge .treeString (struct2)

這將給你:

%scala res0: String = "root |——a: integer (nullable = true) |——b: long (nullable = false) |——c: timestamp (nullable = true) "

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

%scala val struct2 =(新的StructType) .add("a", "int", true) .add("b", "string", false)

然後測試會給你以下結果SparkException

合並字段'b'和'b'失敗。日誌含義合並不兼容的數據類型LongType和StringType失敗