更新:spark-avro 包已更新以支持这种情况。https://github.com/databricks/spark-avro/releases/tag/v3.1.0
我有一个由我无法控制的第三方创建的 AVRO 文件,我需要使用 spark 处理它。AVRO 模式是其中一个字段是混合联合类型的记录:
{
"name" : "Properties",
"type" : {
"type" : "map",
"values" : [ "long", "double", "string", "bytes" ]
}
spark-avro阅读器不支持此功能:
除了上面列出的类型,它还支持读取三种联合类型: union(int, long) union(float, double) union(something, null),其中something是上面列出的支持的Avro类型之一或者是支持的联合类型之一。
阅读有关 AVRO 的架构演变和解决方案,我希望能够通过指定省略此字段的不同读取器架构来读取文件,同时跳过有问题的字段。根据AVRO Schema Resolution docs,它应该可以工作:
如果作者的记录包含一个名称不存在于读者记录中的字段,则忽略该字段的作者值。
所以我修改使用
val df = sqlContext.read.option("avroSchema", avroSchema).avro(path)
avroSchema
作者使用的完全相同的架构在哪里,但没有有问题的字段。
但是关于混合联合类型,我仍然遇到同样的错误。
AVRO 是否支持这种模式演变场景?与 avro 火花?还有其他方法可以实现我的目标吗?
更新:我已经使用 Apache Avro 1.8.1 测试了相同的场景(实际上是相同的文件)并且它按预期工作。那么它必须专门与spark-avro
. 有任何想法吗?