JSON sans schéma vers le type "Row" d'Apache Beam ?

Aug 18 2020

Existe-t-il un moyen de convertir des chaînes JSON arbitraires sans schéma en types "Row" Apache Beam à l'aide du SDK Java ? Sinon, est-il possible de dériver un type de schéma de faisceau à partir d'un objet existant ?

J'ai trouvé la documentation pour JsonToRow et ParseJsons , mais ils nécessitent soit qu'une classe Schema ou POJO soit fournie pour fonctionner. J'ai également constaté que vous pouvez lire des chaînes JSON dans un BigQuery TableRow , mais il ne semble pas y avoir de moyen de convertir TableRow en Row qui n'implique pas déjà d'avoir un schéma.

Réponses

2 robertwb Aug 21 2020 at 07:10

Non, ce n'est pas possible car Row (et les frameworks qui l'utilisent) nécessitent de connaître le schéma au moment de la construction. Une option consiste, au moment de la construction, à lire une petite partie de vos données pour déduire votre schéma et à l'utiliser pour appeler votre transformation JsonToRow.

2 Mr.Llama Aug 22 2020 at 02:03

Malheureusement, la réponse générique semble être "non", bien qu'il existe certaines situations spécifiques où la réponse peut être "oui".

Le problème est que les schémas ne sont pas compatibles à 100 % avec les types de données JSON, en particulier à cause du type de champ ARRAY .
Dans JSON, les éléments d'une liste peuvent avoir des types de données différents, mais les schémas dans Beam exigent que chaque élément soit d'un ARRAY pour être du même type. Ce type peut être un autre ROW, ou même un type logique , mais tous les éléments doivent être identiques.
Malheureusement, l'utilisation d'un ROW pour remplacer un ARRAY ne fonctionne pas entièrement. Bien que les champs ROW soient positionnels, ils sont également nommés, ce qui les rapproche d'un MAP. De plus, si votre ensemble de données contient des listes JSON de longueurs différentes, vous vous retrouverez avec chaque ligne ayant un schéma différent, ce qui aura des conséquences indésirables.

Donc, si vos données JSON n'utilisent pas de listes de types arbitraires, tout devrait bien se passer. Cela dit, Beam ne fournit aucun utilitaire pour dériver des schémas à partir de JSON, vous devrez donc créer vous-même cette solution.

1 user2910265 Jan 08 2021 at 11:20

Je rencontre cette situation exacte au travail et je confirme tout ce que vous avez dit sur les options de traitement JSON limitées. Il s'avère que Beam fournit quelque chose qui peut convertir un BigQuery TableRow/TableSchema en Beam Row/Schema . Si vous choisissez cela comme schéma et continuez avec JsonToRow, vous devrez combler l'incompatibilité d'impédance de type de données entre les types de données JSON et Beam produits par BigQueryUtils.fromTableSchema (BYTES, DATETIME, types logiques générés par BigQueryUtils ).