【发布时间】:2019-01-28 11:12:03
【问题描述】:
BigQuery 支持以下策略:
WRITE_APPEND - 指定可以将行附加到现有表中。
WRITE_EMPTY - 指定输出表必须为空。
WRITE_TRUNCATE - 指定写入应该替换一个表。
它们都不适合UPSERT 操作的目的。
我正在将订单 Json 文件导入 Google 存储,我想将其加载到 BigQuery。正如逻辑所暗示的那样,一些记录将是新的,而其他记录已经存在于以前的加载中并且需要更新(例如更新订单状态(新/暂停/已发送/退款等...)
我正在使用 Airflow,但我的问题很笼统:
update_bigquery = GoogleCloudStorageToBigQueryOperator(
dag=dag,
task_id='load_orders_to_BigQuery',
bucket=GCS_BUCKET_ID,
destination_project_dataset_table=table_name_template,
source_format='NEWLINE_DELIMITED_JSON',
source_objects=[gcs_export_uri_template],
schema_fields=dc(),
create_disposition='CREATE_IF_NEEDED',
write_disposition='WRITE_TRUNCATE',
skip_leading_rows = 1,
google_cloud_storage_conn_id=CONNECTION_ID,
bigquery_conn_id=CONNECTION_ID
)
此代码使用WRITE_TRUNCATE,这意味着它会删除整个表并加载请求的文件。
如何修改它以支持UPSERT?
我唯一的选择是查询表搜索出现在json中的现有订单删除它们然后执行LOAD吗?
【问题讨论】:
-
嗨。我不认为这是可能的。 Jan 有一个类似的问题,我不记得从那以后它被更新了。 stackoverflow.com/questions/48177241/…
-
正确,BigQuery 不支持
UPSERT语句。另一个问题仍然有效,但值得指出的是,BigQuery 现在支持MERGE作为其 DML 的一部分。 -
@GrahamPolley 你能解释一下合并 DML 吗?
标签: google-bigquery