BigQuery Omni写入AWS S3失败:同区域操作不支持问题求助
解决BigQuery Omni外部表无法写入的问题
问题场景
你已完成以下操作:
- 创建BigQuery到AWS的外部连接:
bq mk --connection --connection_type='AWS' \ --iam_role_id=arn:aws:iam::XXXXXXXXX:role/role_super \ --location=europe-west1 \ export_to_s3 - 创建AWS区域的Schema和指向S3 Parquet文件的外部表:
CREATE SCHEMA super_schema OPTIONS (location = 'aws-eu-west-1');CREATE EXTERNAL TABLE `project_name.super_schema.super_table` WITH CONNECTION `project_name.aws-eu-west-1.export_to_s3` OPTIONS ( format = 'PARQUET', uris = ["s3://xxxxxxxxxxxxxxxx/YYYY/*.parquet"] ); - 成功读取外部表数据,但执行
INSERT时失败,报错:针对BigQuery Omni,无法在同一区域aws-eu-west-1内执行写入操作
原因
BigQuery Omni针对AWS区域的外部表仅支持只读操作,外部表本质是对S3存储中数据的映射,Omni当前不允许直接通过DML语句(INSERT/UPDATE/DELETE)向这类外部表写入数据。
解决方案
方案1:通过本地表中转后导出到S3
先将数据写入BigQuery Omni的本地表,再导出到目标S3路径:
-- 创建同区域的本地表 CREATE TABLE `project_name.super_schema.super_local_table` (a INT64, b INT64) OPTIONS (location = 'aws-eu-west-1'); -- 插入数据到本地表 INSERT INTO `project_name.super_schema.super_local_table` (a, b) VALUES (10,10); -- 将本地表数据导出到S3 EXPORT DATA OPTIONS( uri='s3://xxxxxxxxxxxxxxxx/YYYY/new_data_*.parquet', format='PARQUET', connection='project_name.aws-eu-west-1.export_to_s3' ) AS SELECT * FROM `project_name.super_schema.super_local_table`;
导出完成后,外部表会自动识别S3中的新文件(若未自动识别,可刷新表元数据)。
方案2:使用ETL工具直接写入S3
如果需要持续向S3写入数据,可使用Dataflow、Cloud Functions等工具,将数据处理后直接写入目标S3路径,再按需刷新外部表的元数据。
内容的提问来源于stack exchange,提问作者raphaelauv
相关产品推荐
相关产品推荐

