2016-11-03 19 views
5

Güncelleme: Bu senaryoyu desteklemek için spark-avro paketi güncellendi. https://github.com/databricks/spark-avro/releases/tag/v3.1.0Spark-avro kullanarak kayıttaki alanları atlama

Kıvılcımı kullanmam gereken üçüncü tarafım tarafından kontrolümün dışında oluşturulmuş bir AVRO dosyası var.

{  
    "name" : "Properties",        
    "type" : {           
    "type" : "map",         
    "values" : [ "long", "double", "string", "bytes" ] 
}             

Bu spark-avro okuyucu ile desteklenmeyen: AVRO şema alanlarından biri karışık birlik türüdür bir kaydıdır

yukarıda listelenen türlerine ek olarak

, bu okuma destekler şey yukarıda listelenen desteklenen Avro türlerinden biridir veya desteklenen birlik türlerinden biridir sendika (int, long) birlik (float, double) birlik (bir şey, null),: sendika tiplerinin üç tip. Avro en şema evrimi ve çözünürlük hakkında Okuma

, ben bu alanı atlar farklı bir okuyucu şema belirterek problemli alan atlarken dosyayı okumak mümkün olmasını bekliyoruz. AVRO Schema Resolution docs göre, çalışması gerekir:

yazarın rekor okuyucunun kaydında bulunmayan bir ada sahip bir alanı içeriyorsa, bu alan için yazarın değeri dikkate alınmaz.

yüzden avroSchema tam aynı şema, kullanılan yazar olmakla sorunlu alanı olmadan

val df = sqlContext.read.option("avroSchema", avroSchema).avro(path) 

kullanılarak modifiye.

Ama yine de karışık sendika türleri ile ilgili aynı hatayı alıyorum.

Avro ile desteklenen şema evrimi bu senaryo var mı? Avro-kıvılcım ile? Hedefe ulaşmak için başka bir yol var mı?


Güncelleme: Apache Avro 1.8.1 ile aynı senaryoyu (aslında aynı dosya) test ettik ve beklendiği gibi çalışır. Sonra özellikle spark-avro ile olmalıdır. herhangi bir fikir?

+0

Bir yanıt değil, ancak 'spark-avro' AVRO şema dönüşümü kurallarına uymuyor. bkz: https://github.com/databricks/spark-avro/issues/176 https: // github.com/databricks/spark-avro/blob/master/src/main/scala/com/databricks/kıvılcım/avro/DefaultSource.scala # L61 – itaysk

+0

Bir ödül yayınladım ama şu ana kadar bildiğin şeyi yayınlarsan harika olur cevap vermezse kimse bir çözüm bulmaz. –

+0

Bulduğum şey, bunun spark-avro kullanılarak yapılamamasıydı. Bunun yerine avro'nun standart API'sini kullanıyorum. Cevap olarak göndermedim çünkü orijinal soruyu çözmüyor, ama farklı bir çözüm önermektedir. Kodu cevap olarak göndermenin faydalı olduğunu düşünüyor musunuz? – itaysk

cevap

5

Güncelleme: kıvılcım-avro paket bu senaryoyu destekleyecek güncelleme oldu. https://github.com/databricks/spark-avro/releases/tag/v3.1.0

Bu aslında sorumu, aynı sorun için oldukça farklı bir çözüm cevap vermez.

Şu anda bu Spark-Avro bu işlevselliğe sahip olmadığından (bu soru için yorum bölümüne bakın) - bunun yerine avro'nun org.apache.avro.mapreduce ve spark'in newAPIHadoopFile numaralı telefonlarını kullandım.

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]) 

tersine-avro kıvılcım, resmi avro kütüphaneleri karışık birlik türleri ve şema evrimi destekler: İşte o basit örneğidir.

+1

Bir kez daha, gönderdiğiniz için teşekkürler :) –