问题
火花工作失败与读取拼花时异常如下文件:
错误的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