Bez schematu JSON do Apache Beam typu „Row”?

Aug 18 2020

Czy istnieje sposób na przekonwertowanie dowolnych ciągów JSON bez schematu na typy „Row” Apache Beam przy użyciu Java SDK? Jeśli nie, czy można wyprowadzić typ schematu belki z istniejącego obiektu?

Znalazłem dokumentację dla JsonToRow i ParseJsons , ale wymagają one dostarczenia klasy Schema lub POJO, aby działały. Odkryłem również, że możesz odczytywać ciągi JSON w BigQuery TableRow, ale wydaje się, że nie ma sposobu na przekonwertowanie TableRow na Row, który nie wymaga już posiadania schematu.

Odpowiedzi

2 robertwb Aug 21 2020 at 07:10

Nie, nie jest to możliwe, ponieważ Row (i frameworki, które go używają) wymagają znajomości schematu w czasie tworzenia. Opcja włączania polega na odczytaniu niewielkiej części danych w czasie konstruowania w celu wywnioskowania schematu i użyciu tego do wywołania transformacji JsonToRow.

2 Mr.Llama Aug 22 2020 at 02:03

Niestety ogólna odpowiedź wydaje się brzmieć „nie”, chociaż są pewne sytuacje, w których odpowiedź może brzmieć „tak”.

Problem polega na tym, że schematy nie są w 100% zgodne z typami danych JSON, w szczególności z powodu typu pola ARRAY .
W formacie JSON elementy listy mogą mieć różne typy danych, ale schematy w belce wymagają, aby każdy element był typu ARRAY, aby był tego samego typu. Ten typ może być innym WIERSZEM lub nawet typem logicznym , ale wszystkie elementy muszą być takie same.
Niestety, użycie ROW do zastąpienia ARRAY nie działa całkowicie. Chociaż pola ROW są pozycyjne, są również nazywane, dzięki czemu są bliżej MAP. Ponadto, jeśli Twój zestaw danych zawiera listy JSON o różnych długościach, każdy wiersz będzie miał inny schemat, co będzie miało niepożądane konsekwencje.

Więc jeśli twoje dane JSON nie używają list dowolnego typu, wszystko powinno być w porządku. To powiedziawszy, Beam nie zapewnia żadnych narzędzi do wyprowadzania schematów z JSON, więc musisz sam stworzyć to rozwiązanie.

1 user2910265 Jan 08 2021 at 11:20

Natrafiam na tę dokładną sytuację w pracy i popieram wszystko, co powiedziałeś o ograniczonych opcjach przetwarzania JSON. Okazuje się, że Beam zapewnia coś, co może konwertować BigQuery TableRow / TableSchema na Beam Row / Schema . Jeśli wybierzesz ten schemat jako swój schemat i będziesz kontynuować z JsonToRow, musisz połączyć niezgodność impedancji typu danych między typami danych JSON i Beam utworzonymi przez BigQueryUtils.fromTableSchema (BYTES, DATETIME, typy logiczne generowane przez BigQueryUtils ).