【发布时间】:2016-11-03 15:29:06
【问题描述】:
更新: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(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。有什么想法吗?
【问题讨论】:
-
不是答案,但似乎
spark-avro不遵守 AVRO 模式演变\解析规则。见:github.com/databricks/spark-avro/issues/176github.com/databricks/spark-avro/blob/master/src/main/scala/com/… -
我发布了一个赏金,但如果你发布你所知道的作为答案,以防没有人提出解决方案,那就太好了。
-
我发现使用 spark-avro 无法完成。相反,我使用 avro 的标准 api。我没有发布答案,因为它没有解决原始问题,而是提出了不同的解决方案。您认为将代码发布为答案是否有益?
-
否定答案仍然是一个答案,如果您有解决方法,它可能会为其他人节省一些时间。
标签: apache-spark avro spark-avro