Schemaloser JSON-zu-Apache-Beam-„Row“-Typ?

Aug 18 2020

Gibt es eine Möglichkeit, beliebige schemalose JSON-Strings mit dem Java SDK in Apache Beam "Row"-Typen zu konvertieren? Wenn nicht, ist es möglich, einen Balkenschematyp von einem vorhandenen Objekt abzuleiten?

Ich habe die Dokumentation für JsonToRow und ParseJsons gefunden , aber sie erfordern entweder die Bereitstellung einer Schema- oder POJO-Klasse, um zu funktionieren. Ich habe auch festgestellt, dass Sie JSON-Strings in eine BigQuery -TableRow einlesen können , aber es scheint keine Möglichkeit zu geben, TableRow in Row zu konvertieren, ohne dass bereits ein Schema vorhanden ist.

Antworten

2 robertwb Aug 21 2020 at 07:10

Nein, dies ist nicht möglich, da Row (und die Frameworks, die es verwenden) das Wissen des Schemas zur Konstruktionszeit erfordern. Optional können Sie zur Konstruktionszeit einen kleinen Teil Ihrer Daten lesen, um Ihr Schema abzuleiten, und dies verwenden, um Ihre JsonToRow-Transformation aufzurufen.

2 Mr.Llama Aug 22 2020 at 02:03

Leider scheint die allgemeine Antwort "nein" zu sein, obwohl es einige spezifische Situationen gibt, in denen die Antwort "ja" sein kann.

Das Problem ist, dass Schemas nicht 100 % kompatibel mit JSON-Datentypen sind, insbesondere wegen des ARRAY -Feldtyps .
In JSON können Elemente einer Liste unterschiedliche Datentypen haben, aber Schemas in Beam erfordern, dass jedes Element von einem ARRAY ist, um denselben Typ zu haben. Dieser Typ kann eine andere ROW oder sogar ein logischer Typ sein, aber alle Elemente müssen gleich sein.
Leider funktioniert die Verwendung einer ROW zum Ersetzen eines ARRAY nicht vollständig. Obwohl ROW-Felder positionsgebunden sind, werden sie auch benannt, wodurch sie näher an eine MAP herankommen. Wenn Ihr Datensatz außerdem JSON-Listen unterschiedlicher Länge enthält, wird jede Zeile ein anderes Schema haben, was unerwünschte Folgen haben wird.

Wenn Ihre JSON-Daten also keine Listen beliebiger Typen verwenden, sollten Sie in Ordnung sein. Allerdings bietet Beam keine Dienstprogramme zum Ableiten von Schemas aus JSON, sodass Sie diese Lösung selbst erstellen müssen.

1 user2910265 Jan 08 2021 at 11:20

Ich stoße bei der Arbeit auf genau diese Situation und unterstütze alles, was Sie über begrenzte JSON-Verarbeitungsoptionen gesagt haben. Es stellt sich heraus, dass Beam etwas bietet , das eine BigQuery TableRow/TableSchema in Beam Row/Schema umwandeln kann . Wenn Sie dies als Ihr Schema auswählen und mit JsonToRow fortfahren, müssen Sie die von BigQueryUtils.fromTableSchema (BYTES, DATETIME, von BigQueryUtils generierte logische Typen ) erzeugte Datentypimpedanz-Fehlanpassung zwischen JSON- und Beam-Datentypen überbrücken.