首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用火花-avro跳过记录中的字段

使用火花-avro跳过记录中的字段
EN

Stack Overflow用户
提问于 2016-11-03 15:29:06
回答 1查看 1.6K关注 0票数 5

更新:星星之火-avro软件包被更新以支持此场景。https://github.com/databricks/spark-avro/releases/tag/v3.1.0

我有一个AVRO文件,它是由我控制之外的第三方创建的,我需要使用spark来处理这个文件。AVRO模式是一个记录,其中一个字段是混合的联合类型:

代码语言:javascript
复制
{    
    "name" : "Properties",                              
    "type" : {                                          
    "type" : "map",                                   
    "values" : [ "long", "double", "string", "bytes" ]
}                                                   

火花-阿夫罗读取器不支持这一点:

除了上面列出的类型之外,它还支持读取三种类型的联合类型: union(int,long) union(float,double) union (某某,null),其中某物是上面列出的受支持的Avro类型之一,或者是受支持的联合类型之一。

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

如果作者的记录包含一个名不在读者记录中的字段,则将忽略该字段的作者值。

所以我修改了

代码语言:javascript
复制
 val df = sqlContext.read.option("avroSchema", avroSchema).avro(path)

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

但是,对于混合联合类型,我仍然得到了相同的错误。

AVRO是否支持这种模式演化的场景?用阿夫罗-火花?还有别的方法来实现我的目标吗?

更新:我已经用Apache 1.8.1测试了相同的场景(实际上是相同的文件),并且它的工作原理与预期一样。那么它必须是专门针对spark-avro的。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-11-13 12:36:19

更新:星星之火-avro软件包被更新以支持此场景。https://github.com/databricks/spark-avro/releases/tag/v3.1.0

这实际上并没有回答我的问题,而是对同一个问题有不同的解决办法。

由于目前spark不具备此功能(请参阅我的评论中的问题),我使用了avro的org.apache.avro.mapreduce和spark的newAPIHadoopFile。下面是一个简单的例子:

代码语言:javascript
复制
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])

相反,为了激发- avro,官方的avro库支持混合的联合类型和模式演化。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40405473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档