更新:星星之火-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" ]
} 火花-阿夫罗读取器不支持这一点:
除了上面列出的类型之外,它还支持读取三种类型的联合类型: union(int,long) union(float,double) union (某某,null),其中某物是上面列出的受支持的Avro类型之一,或者是受支持的联合类型之一。
通过阅读AVRO的模式演变和解析,我希望能够在跳过问题字段的同时,通过指定省略此字段的不同读取器模式来读取该文件。根据AVRO模式解析文档,它应该工作:
如果作者的记录包含一个名不在读者记录中的字段,则将忽略该字段的作者值。
所以我修改了
val df = sqlContext.read.option("avroSchema", avroSchema).avro(path)其中,avroSchema是完全相同的模式,作者使用,但没有问题的字段。
但是,对于混合联合类型,我仍然得到了相同的错误。
AVRO是否支持这种模式演化的场景?用阿夫罗-火花?还有别的方法来实现我的目标吗?
更新:我已经用Apache 1.8.1测试了相同的场景(实际上是相同的文件),并且它的工作原理与预期一样。那么它必须是专门针对spark-avro的。有什么想法吗?
发布于 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。下面是一个简单的例子:
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库支持混合的联合类型和模式演化。
https://stackoverflow.com/questions/40405473
复制相似问题