我有两个表,都是来自两个不同地区的GCP的计费数据。我想把一张桌子插入另一张桌子。这两个表都是按天分区的,GCP正在写入较大的表以进行计费导出,这就是为什么我想将数据插入较大的表中。
我正在尝试以下操作:
- 将较小的表格导出到谷歌云存储(GCS(,以便将其导入到其他区域
- 将表格从GCS导入Big Query
- 使用Big Query SQL运行
INSERT INTO dataset.big_billing_table SELECT * FROM dataset.small_billing_table
但是,我遇到了很多问题,因为它不允许我插入(因为架构中有重复的字段等(。数据集示例可在此处找到https://bigquery.cloud.google.com/table/data-analytics-pocs:public.gcp_billing_export_v1_EXAMPL_E0XD3A_DB33F1
谢谢:(
##更新##
因此,问题是使用Avro格式导出和导入数据,并在将表导入时使用自动检测模式(时间戳与整数类型混淆(。
解决方案
将JSON格式的小表导出到GCS,使用GCS进行文件的区域传输,然后将JSON文件导入Bigquery表,DONT使用模式自动检测(例如手动指定模式(。然后你可以使用INSERT INTO没有问题等
我能够用您提供的示例数据集重现您的案例。我使用了由以下查询生成的伪表来证实这些情况:
表1:billing_bigquery
SELECT * FROM `data-analytics-pocs.public.gcp_billing_export_v1_EXAMPL_E0XD3A_DB33F1`
where service.description ='BigQuery' limit 1000
表2:billing_pubsub
SELECT * FROM `data-analytics-pocs.public.gcp_billing_export_v1_EXAMPL_E0XD3A_DB33F1`
where service.description ='Cloud Pub/Sub' limit 1000
我将提出执行这项任务的两种方法。但是,我必须指出,目标表和源表必须具有相同的列名,至少是要插入的列名。
首先,我使用了INSERT TO方法。然而,我想强调的是,根据文档,如果您的表被分区,则必须包括将用于插入新行的列名。因此,使用已经显示的伪数据,它将如下所示:
INSERT INTO `billing_bigquery` ( billing_account_id, service, sku, usage_start_time, usage_end_time, project, labels, system_labels, location, export_time, cost, currency, currency_conversion_rate, usage, credits )#invoice, cost_type
SELECT billing_account_id, service, sku, usage_start_time, usage_end_time, project, labels, system_labels, location, export_time, cost, currency, currency_conversion_rate, usage, credits
FROM `billing_pubsub`
请注意,对于嵌套字段,我只写下字段名称,例如:service,而不是service.description,因为它们已经被使用了。此外,我没有选择目标数据集中的所有列,但我在目标表中选择的所有列也需要在源表选择中。
第二种方法,您可以简单地使用Query settings按钮将small_billing_table附加到big_billing_table。在BigQuery控制台中,单击更多>查询设置。然后将出现设置窗口,您转到目标表,选中为查询结果设置目标表并填写字段:项目名称,数据集名称和表名称-这些是目标表的信息-。随后,在目标表写入首选项检查附加到表,根据文档:
附加到表--将查询结果附加到现有表
然后运行以下查询:
Select * from <project.dataset.source_table>
然后在运行它之后,源的表数据应该附加到目标的表中。