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:
yüzdenyazarın rekor okuyucunun kaydında bulunmayan bir ada sahip bir alanı içeriyorsa, bu alan için yazarın değeri dikkate alınmaz.
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?
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
Bir ödül yayınladım ama şu ana kadar bildiğin şeyi yayınlarsan harika olur cevap vermezse kimse bir çözüm bulmaz. –
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