問題
火花工作失敗與讀取拚花時異常如下文件:
錯誤的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