gpt4 book ai didi

apache-spark - 使用 spark-avro 跳过记录中的字段

转载 作者:行者123 更新时间:2023-12-04 18:59:48 24 4
gpt4 key购买 nike

更新: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 不支持此操作读者:

In addition to the types listed above, it supports reading of three types of union types: union(int, long) union(float, double) union(something, null), where something is one of the supported Avro types listed above or is one of the supported union types.



阅读有关 AVRO 的模式演变和解析的内容时,我希望能够通过指定省略该字段的不同读取器模式来跳过有问题的字段来读取文件。
根据 AVRO Schema Resolution docs ,它应该工作:

if the writer's record contains a field with a name not present in the reader's record, the writer's value for that field is ignored.



所以我修改使用
 val df = sqlContext.read.option("avroSchema", avroSchema).avro(path)

哪里 avroSchema是作者使用的完全相同的模式,但没有有问题的字段。

但是我仍然遇到关于混合联合类型的相同错误。

AVRO 是否支持这种模式演变场景?用 avro Spark ?
还有其他方法可以实现我的目标吗?

更新:
我已经使用 Apache Avro 1.8.1 测试了相同的场景(实际上是相同的文件)并且它按预期工作。那么它必须专门与 spark-avro .有任何想法吗?

最佳答案

更新:spark-avro 包已更新以支持这种情况。 https://github.com/databricks/spark-avro/releases/tag/v3.1.0

这实际上并没有回答我的问题,而是针对同一问题的不同解决方案。

由于目前 spark-avro 没有此功能(请参阅我对问题的评论) - 我改用了 avro 的 org.apache.avro.mapreduce和 Spark 的 newAPIHadoopFile .这是一个简单的例子:

val path = "..."
val conf = new SparkConf().setAppName("avro test")
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
val sc = new SparkContext(conf)

val avroRdd = sc.newAPIHadoopFile(path,
classOf[AvroKeyInputFormat[GenericRecord]],
classOf[AvroKey[GenericRecord]],
classOf[NullWritable])

与 spark-avro 不同,官方 avro 库支持混合联合类型和模式演变。

关于apache-spark - 使用 spark-avro 跳过记录中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40405473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com