Python & Bigquery:使用 for 循环在表中逐行查询和插入数据

Posted

技术标签:

【中文标题】Python & Bigquery:使用 for 循环在表中逐行查询和插入数据【英文标题】:Python & Bigquery: Using for loop to query and insert data row by row in a table 【发布时间】:2021-11-16 01:05:23 【问题描述】:

我正在尝试在 for 循环中触发查询 (Google BigQuery),并在每个循环中将数据插入表中。但是,我只看到表格中的最后一行。所以我假设它正在覆盖这些值。

代码如下:

for x in proc_arr:
    query = """

    BEGIN

     <QUERY>

    SELECT * FROM <table1> WHERE  procedureid = 
 
    INSERT INTO <table> 

    SELECT procedureid FROM <tmp_proc1>
    UNION ALL
    SELECT procedureid FROM <tmp_proc2>
    ;

    END;

    """.format(x)

我没有在此处编写实际查询,因为这不是必需的。 proc_arr 有 80 个 id,它只插入第 80 个 id 的数据。任何帮助表示赞赏。谢谢!

【问题讨论】:

对我来说似乎很好。问题可能在于将查询发送到 BigQuery。或者它可能在缺少的 子查询中。 【参考方案1】:

假设我在表 1 中有数据,我想按 ID 循环遍历它,然后将其插入表 2。使用上面的代码 sn-p,我能够将表 1 中的数据插入每个 ID 的表 2。只需确保您的 client.query() 在循环中即可。

表 1:

表2(初始值):

下面的代码使用从表 1 查询的数据,同时循环通过 proc_arr(我假设您的 ID 存储在此处),然后将其插入表 2。

from google.cloud import bigquery

def insert_data():
    client = bigquery.Client()
    proc_arr = ['asdf','test_value','cust_1']
    for x in proc_arr:
        query = """
                INSERT INTO `sandbox.table2` (customer,amount_paid)
                SELECT * FROM `sandbox.table1`
                WHERE customer =  ''
                ORDER BY amount_paid ASC LIMIT 1
                """.format(x)
        query_job = client.query(query=query)
        results = query_job.result()

if __name__ == "__main__":
    insert_data()

表2(运行python脚本后):

【讨论】:

@Misscurious 让我知道我的回答是否有帮助,以便我更新/删除它。

以上是关于Python & Bigquery:使用 for 循环在表中逐行查询和插入数据的主要内容,如果未能解决你的问题,请参考以下文章

Google api - bigquery & Appengine - 无法创建数据集

Google Cloud Pub/Sub - Cloud Function & Bigquery - 数据插入未发生

使用python从bigquery处理大量数据集,将其加载回bigquery表

使用 python 和 BigQuery API 获取 BigQuery 数据集中的表列表

使用 python 的 BigQuery 外部表

使用 Python 将 Pub/Sub 消息加载到 BigQuery