使用Python将数据从datasteam加载到BigQuery

使用Python将数据从datasteam加载到BigQuery,python,google-bigquery,Python,Google Bigquery,我使用API调用从服务检索数据。 数据是嵌套的Json,其数组可能也包含Json对象 例如: 基本上我想把它上传到BigQuery中的表中。 我为每个数组创建了一个表。Jason在同一张表中解包的对象。 例如: Orders: All customer fields, all ShippingAdress, orderDateUtc etc.. Orders_items: orderid, discountEach, giftTo etc.. Order_items_historicalCa

我使用API调用从服务检索数据。 数据是嵌套的Json,其数组可能也包含Json对象

例如:

基本上我想把它上传到BigQuery中的表中。 我为每个数组创建了一个表。Jason在同一张表中解包的对象。 例如:

Orders: All customer fields, all ShippingAdress, orderDateUtc etc..
Orders_items:  orderid, discountEach, giftTo etc..
Order_items_historicalCategories: ....
我不确定最好的方法是什么。 我可以从API调用(数据流)创建CSV文件,然后使用COPY per CSV上传它们,但这似乎有些过分。我正在寻找一种跳过CSV创建的方法

是否有操作员或程序包可以处理此数据并将其直接上载到表中?我假设我需要做的事情已经被许多其他组织完成了,但是我在文档中没有看到任何“内置”方法来完成


任何帮助都将不胜感激

您基本上必须遵循有关如何使用的文档。例如,使用后一个链接中的模式,可以按以下方式加载嵌套和重复的JSON数据(可以使用找到的示例数据进行测试):


谢谢。为什么要创建表调用?该表不应该预先创建吗?还有,我必须硬编码字段名吗?假设我有16个不同的API调用,它不能获取Json文件的列名吗?您不必创建表。为了反映这一点,我改变了答案。python客户端库不支持从JSON文件(检查)加载模式,但这是已经请求的功能,目前在.OK。。。但是这个方法的问题是我必须列出代码中的所有列。。这不是很一般,我从一个API调用中得到了150列。(我还有6个API调用)。这是唯一的方法吗?您可以编写一个方法,用表的模式解析json文件,并将输出传递到
LoadJobConfig().schema
。我认为这是使用python所能得到的最好结果,除非您看到我在本文中缺少的东西。您还可以使用
bq
cli,它支持将模式作为json文件传递(查找
bq load
)。
import sys

def load_nested_json():
    from google.cloud import bigquery
    client = bigquery.Client()

    dataset_id, table_id, uri = sys.argv[1:]
    dataset_ref = client.dataset(dataset_id)
    job_config = bigquery.LoadJobConfig()
    job_config.schema = [
        bigquery.SchemaField('id', 'STRING', mode='NULLABLE'),
        bigquery.SchemaField('first_name', 'STRING', mode='NULLABLE'),
        bigquery.SchemaField('last_name', 'STRING', mode='NULLABLE'),
        bigquery.SchemaField('dob', 'DATE', mode='NULLABLE'),
        bigquery.SchemaField('addresses', 'RECORD', mode='REPEATED', fields=[
            bigquery.SchemaField('status', 'STRING', mode='NULLABLE'),
            bigquery.SchemaField('address', 'STRING', mode='NULLABLE'),
            bigquery.SchemaField('city', 'STRING', mode='NULLABLE'),
            bigquery.SchemaField('state', 'STRING', mode='NULLABLE'),
            bigquery.SchemaField('zip', 'STRING', mode='NULLABLE'),
            bigquery.SchemaField('numberOfYears', 'STRING', mode='NULLABLE'),
        ]),
    ]
    table_ref = dataset_ref.table(table_id)
    # Uncomment following lines to also create the destination table
    # table = bigquery.Table(table_ref, job_config.schema)
    # table = client.create_table(table)

    # print('Created table {}'.format(table.full_table_id))

    job_config.source_format = "NEWLINE_DELIMITED_JSON"

    load_job = client.load_table_from_uri(
        uri,
        table_ref,
        job_config=job_config)  # API request

    assert load_job.job_type == 'load'

    load_job.result()  # Waits for table load to complete.

    assert load_job.state == 'DONE'

if __name__ == '__main__':
    load_nested_json()