Şemasız JSON'dan Apache Beam'e "Satır" türü?

Aug 18 2020

Java SDK kullanarak rasgele şema içermeyen JSON dizelerini Apache Beam "Satır" türlerine dönüştürmenin bir yolu var mı ? Değilse, mevcut bir Nesneden bir Işın Şeması türü türetmek mümkün müdür?

JsonToRow ve ParseJsons belgelerini buldum , ancak çalışmak için bir Schema veya POJO sınıfının sağlanmasını gerektiriyorlar. Ayrıca JSON dizelerini bir BigQuery TableRow'a okuyabileceğinizi, ancak TableRow'u Row'a dönüştürmenin zaten bir şema içermeyen bir yolu olmadığını da buldum.

Yanıtlar

2 robertwb Aug 21 2020 at 07:10

Hayır, bu mümkün değildir, çünkü Row (ve onu kullanan çerçeveler) şemanın yapım sırasında bilinmesini gerektirmektedir. Açık seçenek, yapım sırasında, şemanızın sonucunu çıkarmak için verilerinizin küçük bir bölümünü okumak ve bunu JsonToRow dönüşümünüzü çağırmak için kullanmaktır.

2 Mr.Llama Aug 22 2020 at 02:03

Ne yazık ki, yanıtın "evet" olabileceği bazı özel durumlar olmasına rağmen, genel yanıt "hayır" olarak görünmektedir.

Sorun, Şemaların JSON veri türleriyle, özellikle ARRAY alan türü nedeniyle% 100 uyumlu olmamasıdır .
JSON'da, bir listenin öğeleri farklı veri türlerine sahip olabilir, ancak Beam'deki Şemalar, her öğenin aynı türde bir DİZİ olmasını gerektirir . Bu tür başka bir SATIR veya hatta mantıksal bir tür olabilir , ancak tüm öğeler aynı olmalıdır.
Ne yazık ki, bir ARRAY'i değiştirmek için bir SATIR kullanmak tamamen çalışmaz. SATIR alanları konumsal olmasına rağmen, aynı zamanda adlandırılırlar ve onları bir MAP'ye daha yakın hale getirir. Ayrıca, veri kümeniz farklı uzunluklarda JSON listeleri içeriyorsa, her Satırda farklı bir Şemaya sahip olursunuz ve bu da istenmeyen sonuçlara yol açar.

Dolayısıyla, JSON verileriniz rastgele türlerin listesini kullanmıyorsa, sorun yaşamazsınız. Bununla birlikte, Beam, JSON'dan şema türetmek için herhangi bir yardımcı program sağlamaz, bu nedenle bu çözümü kendiniz oluşturmanız gerekir.

1 user2910265 Jan 08 2021 at 11:20

İşte tam olarak bu durumla karşılaşıyorum ve sınırlı JSON işleme seçenekleri hakkında söylediğiniz her şeyi önemsiyorum. Beam'in bir BigQuery TableRow / TableSchema'yı Beam Row / Schema'ya dönüştürebilen bir şey sağladığı ortaya çıktı . Bunu şemanız olarak seçip JsonToRow ile devam ederseniz, BigQueryUtils.fromTableSchema (BYTES, DATETIME, BigQueryUtils tarafından oluşturulan mantıksal türler ) tarafından üretilen JSON ve Beam veri türleri arasındaki veri türü empedans uyumsuzluğunu köprülemeniz gerekir .