如何在写入 JSON 记录时使用 python BigQuery 客户端执行 UPSERT 操作
How to perform the UPSERT operation using the python BigQuery client when writing JSON record
我正在使用函数 bq.insert_rows_json(f'{project}.{dataset}.{table_name}', rows_to_insert)
将 JSON 条记录写入 BigQuery table。这个操作是在INSERT
模式下完成的。我想知道我是否可以在 UPSERT
模式下使用相同的功能。可能吗 ?我查看了文档 here 但没有找到相关论据。
我似乎找不到 python 的 in-built UPSERT
函数。但是,您可以尝试考虑以下源自@Mr.Nobody.
评论的方法
from google.cloud import bigquery
client = bigquery.Client()
query_job = client.query(
"""
MERGE my-dataset.json_table T
USING my-dataset.json_table_source S
ON T.int64_field_0 = S.int64_field_0
WHEN MATCHED THEN
UPDATE SET string_field_1 = s.string_field_1
WHEN NOT MATCHED THEN
INSERT (int64_field_0, string_field_1) VALUES(int64_field_0, string_field_1)"""
)
results = query_job.result() # Waits for job to complete.
在这种方法中,您需要在 table 上提取所有所谓的“更新”JSON 数据,然后再将它们插入或更新到主 BigQuery table。如果 主 ID(唯一性检查器)已经存在(那么查询将执行 UPDATE
)或尚未存在,则查询会将每一行与主 table 匹配(然后查询将执行 INSERT
)。
在 运行 python 代码之前的两个 table 的屏幕截图。
主要Table:
来源Table:
当 python 代码执行完毕时主 Table 的屏幕截图。
结论: int64_field_0
4 已更新(从版本 1.0.0. 到 6.5.1),因为它已存在于 Main table 中。 int64_field_0
5 已插入,因为它在主 table.
上尚不存在
我正在使用函数 bq.insert_rows_json(f'{project}.{dataset}.{table_name}', rows_to_insert)
将 JSON 条记录写入 BigQuery table。这个操作是在INSERT
模式下完成的。我想知道我是否可以在 UPSERT
模式下使用相同的功能。可能吗 ?我查看了文档 here 但没有找到相关论据。
我似乎找不到 python 的 in-built UPSERT
函数。但是,您可以尝试考虑以下源自@Mr.Nobody.
from google.cloud import bigquery
client = bigquery.Client()
query_job = client.query(
"""
MERGE my-dataset.json_table T
USING my-dataset.json_table_source S
ON T.int64_field_0 = S.int64_field_0
WHEN MATCHED THEN
UPDATE SET string_field_1 = s.string_field_1
WHEN NOT MATCHED THEN
INSERT (int64_field_0, string_field_1) VALUES(int64_field_0, string_field_1)"""
)
results = query_job.result() # Waits for job to complete.
在这种方法中,您需要在 table 上提取所有所谓的“更新”JSON 数据,然后再将它们插入或更新到主 BigQuery table。如果 主 ID(唯一性检查器)已经存在(那么查询将执行 UPDATE
)或尚未存在,则查询会将每一行与主 table 匹配(然后查询将执行 INSERT
)。
在 运行 python 代码之前的两个 table 的屏幕截图。
主要Table:
当 python 代码执行完毕时主 Table 的屏幕截图。
结论: int64_field_0
4 已更新(从版本 1.0.0. 到 6.5.1),因为它已存在于 Main table 中。 int64_field_0
5 已插入,因为它在主 table.