从CSV更新BigQuery表

时间:2019-11-20 14:25:44

标签: python google-bigquery

假设在BigQuery中有一个表,其标题如下: id |名称|价格

并且在此表中大约有100万行。

而且,我们有一个csv文件,其中有10万行具有相同的标头:id |名称|价钱 CSV位于ftp服务器上。

但是:CSV中的几行具有与表中相同的ID,其他行具有新ID

任务是:通过匹配ID将表中的行替换为CSV中的新行, 并附加带有新ID的CSV行。

例如,在表中

id | name | price

0, str0, 1000

1, str1, 1500

CSV格式

id | name | price

0, str01, 1300

2, str2, 2500

更新后我们应该拥有

id | name | price

0, str01, 1300 (updated)

1, str1, 1500

2, str2, 2500 (new)

我可以使用google.cloud之类的Python库吗?

1 个答案:

答案 0 :(得分:0)

您可以使用以下步骤将数据更新到BigQuery:

步骤1:将CSV文件复制到云存储

$ gsutil cp data.csv gs://demo-bucket-0816 

第2步:创建表定义文件

$ bq mkdef --autodetect --source_format=CSV "gs://demo-bucket-0816/data.csv" > myschema

第3步:创建外部表

$ bq mk --external_table_definition=myschema bq_poc.ext_data

步骤4.1:使用BigQuery CLI合并语句

$ bq query --nouse_legacy_sql 'MERGE bq_poc.target_data td USING bq_poc.ext_data ed ON td.id = ed.id WHEN MATCHED THEN UPDATE SET price=ed.price WHEN NOT MATCHED THEN INSERT (id, name, price) VALUES(ed.id, ed.name, ed.price)'

步骤4.2:使用Python合并语句

from google.cloud import bigquery

mergeQuery = """MERGE bq_poc.target_data td 
                USING bq_poc.ext_data ed 
                    ON td.id = ed.id 
                WHEN MATCHED THEN 
                    UPDATE SET price=ed.price 
                WHEN NOT MATCHED THEN 
                    INSERT (id, name, price) VALUES(ed.id, ed.name, ed.price)"""
bigqueryClient = bigquery.Client()
sqlJob = bigqueryClient.query(mergeQuery)
sqlJob.result()