Cómo insertar / agregar datos no estructurados a la tabla de bigquery

Fondo

Quiero insertar / añadir JSON formateado de nueva línea en la tabla de bigquery través de la API del cliente de Python.

P.ej:

 {"name":"xyz",mobile:xxx,location:"abc"} {"name":"xyz",mobile:xxx,age:22} 

El problema es que todos los campos en una fila son opcionales y no hay un esquema definido fijo para los datos.

Consulta

He leído que podemos usar tablas federadas, que admiten la detección de autochema.

Sin embargo, estoy buscando una característica, que detectaría automáticamente el esquema a partir de los datos, crearía tablas en consecuencia e incluso ajustaría el esquema de la tabla si aparecen columnas / claves adicionales en los datos en lugar de crear una nueva tabla.

¿Sería esto posible utilizando la API del cliente de Python?

Puede usar Autodetect con BigQuery load API, es decir, su ejemplo con la herramienta bq cli se verá como sigue:

 ~$ cat /tmp/x.json {"name":"xyz","mobile":"xxx","location":"abc"} {"name":"xyz","mobile":"xxx","age":"22"} ~$ bq load --autodetect --source_format=NEWLINE_DELIMITED_JSON tmp.x /tmp/x.json Upload complete. ~$ bq show tmp.x Table tmp.x Last modified Schema Total Rows Total Bytes Expiration ----------------- --------------------- ------------ ------------- ------------ 16 Aug 08:23:35 |- age: integer 2 33 |- location: string |- mobile: string |- name: string ~$ bq query "select * from tmp.x" +------+----------+--------+------+ | age | location | mobile | name | +------+----------+--------+------+ | NULL | abc | xxx | xyz | | 22 | NULL | xxx | xyz | +------+----------+--------+------+ 

Actualización: si más adelante necesita agregar campos adicionales, puede usar schema_update_option para permitir nuevos campos. Por desgracia, aún no funciona con la detección automática, por lo que debe proporcionar un nuevo esquema explícitamente a la API de carga:

 ~$ cat /tmp/x1.json {"name":"abc","mobile":"yyy","age":"25","gender":"male"} ~$ bq load --schema=name:STRING,age:INTEGER,location:STRING,mobile:STRING,gender:STRING --schema_update_option=ALLOW_FIELD_ADDITION --source_format=NEWLINE_DELIMITED_JSON tmp.x /tmp/x1.json Upload complete. ~$ bq show tmp.x Table tmp.x Last modified Schema Total Rows Total Bytes Expiration ----------------- --------------------- ------------ ------------- ----------- 19 Aug 10:43:09 |- name: string 3 57 |- age: integer |- location: string |- mobile: string |- gender: string ~$ bq query "select * from tmp.x" status: DONE +------+------+----------+--------+--------+ | name | age | location | mobile | gender | +------+------+----------+--------+--------+ | abc | 25 | NULL | yyy | male | | xyz | NULL | abc | xxx | NULL | | xyz | 22 | NULL | xxx | NULL | +------+------+----------+--------+--------+