不兼容的模式在一些文件

学习如何解决不兼容的模式与砖铺的文件。

写的亚当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


这篇文章有用吗?