JSON sem esquema para o tipo “Row” do Apache Beam?

Aug 18 2020

Existe uma maneira de converter strings JSON arbitrárias sem esquema em tipos "Row" do Apache Beam usando o Java SDK? Se não, é possível derivar um tipo de Beam Schema de um objeto existente?

Encontrei a documentação para JsonToRow e ParseJsons , mas eles exigem que uma classe Schema ou POJO seja fornecida para funcionar. Também descobri que você pode ler strings JSON em um BigQuery TableRow , mas não parece haver uma maneira de converter TableRow em Row que não envolva já ter um esquema.

Respostas

2 robertwb Aug 21 2020 at 07:10

Não, isso não é possível porque o Row (e os frameworks que o utilizam) exigem o conhecimento do esquema na hora da construção. A opção é, no momento da construção, ler uma pequena parte de seus dados para inferir seu esquema e usar isso para invocar sua transformação JsonToRow.

2 Mr.Llama Aug 22 2020 at 02:03

Infelizmente, a resposta genérica parece ser "não", embora existam algumas situações específicas em que a resposta pode ser "sim".

O problema é que os esquemas não são 100% compatíveis com os tipos de dados JSON, especificamente por causa do tipo de campo ARRAY .
No JSON, os elementos de uma lista podem ter tipos de dados diferentes, mas os esquemas no Beam exigem que cada elemento seja de um ARRAY para ser do mesmo tipo. Esse tipo pode ser outro ROW, ou até mesmo um tipo lógico , mas todos os elementos devem ser iguais.
Infelizmente, usar um ROW para substituir um ARRAY não funciona totalmente. Embora os campos ROW sejam posicionais, eles também são nomeados, tornando-os mais próximos de um MAP. Além disso, se seu conjunto de dados contiver listas JSON de comprimentos diferentes, você terá cada linha com um esquema diferente, o que terá consequências indesejáveis.

Portanto, se seus dados JSON não usam listas de tipos arbitrários, você deve estar bem. Dito isso, o Beam não fornece nenhum utilitário para derivar esquemas de JSON, portanto, você mesmo precisará criar essa solução.

1 user2910265 Jan 08 2021 at 11:20

Estou me deparando com essa situação exata no trabalho e apoio tudo o que você disse sobre as opções limitadas de processamento de JSON. Acontece que o Beam fornece algo que pode converter um BigQuery TableRow/TableSchema em Beam Row/Schema . Se você escolher isso como seu esquema e prosseguir com JsonToRow, precisará eliminar a incompatibilidade de impedância de tipo de dados entre os tipos de dados JSON e Beam produzidos por BigQueryUtils.fromTableSchema (BYTES, DATETIME, tipos lógicos gerados por BigQueryUtils ).