¿JSON sin esquema a Apache Beam tipo "Fila"?
¿Hay alguna manera de convertir cadenas JSON arbitrarias sin esquema en tipos de "Fila" de Apache Beam utilizando el SDK de Java? Si no, ¿es posible derivar un tipo de esquema de haz de un objeto existente?
Encontré la documentación para JsonToRow y ParseJsons , pero requieren que se proporcione una clase Schema o POJO para que funcionen. También descubrí que puede leer cadenas JSON en BigQuery TableRow , pero no parece haber una manera de convertir TableRow en Row que no implique tener un esquema.
Respuestas
No, esto no es posible ya que Row (y los marcos que lo usan) requieren conocer el esquema en el momento de la construcción. Una opción es, en el momento de la construcción, leer una pequeña parte de sus datos para inferir su esquema y usarlo para invocar su transformación JsonToRow.
Desafortunadamente, la respuesta genérica parece ser "no", aunque hay algunas situaciones específicas en las que la respuesta puede ser "sí".
El problema es que los esquemas no son 100 % compatibles con los tipos de datos JSON, específicamente debido al tipo de campo ARRAY .
En JSON, los elementos de una lista pueden tener diferentes tipos de datos, pero los esquemas en Beam requieren que cada elemento sea de un ARRAY para ser del mismo tipo. Este tipo puede ser otra FILA, o incluso un tipo lógico , pero todos los elementos deben ser iguales.
Desafortunadamente, usar una FILA para reemplazar un ARRAY no funciona del todo. Aunque los campos ROW son posicionales, también tienen nombre, lo que los hace más parecidos a un MAP. Además, si su conjunto de datos contiene listas JSON de diferentes longitudes, terminará con cada fila con un esquema diferente que tendrá consecuencias no deseadas.
Entonces, si sus datos JSON no usan listas de tipos arbitrarios, debería estar bien. Dicho esto, Beam no proporciona ninguna utilidad para derivar esquemas de JSON, por lo que deberá crear esa solución usted mismo.
Me encuentro exactamente en esta situación en el trabajo y secundo todo lo que dijiste sobre las opciones limitadas de procesamiento de JSON. Resulta que Beam proporciona algo que puede convertir BigQuery TableRow/TableSchema en Beam Row/Schema . Si elige eso como su esquema y continúa con JsonToRow, deberá salvar la discrepancia de impedancia del tipo de datos entre los tipos de datos JSON y Beam producidos por BigQueryUtils.fromTableSchema (BYTES, DATETIME, tipos lógicos generados por BigQueryUtils ).