使用联合查询将 bigquery 表与谷歌云 postgres 表合并
Posted
技术标签:
【中文标题】使用联合查询将 bigquery 表与谷歌云 postgres 表合并【英文标题】:Merge bigquery table with google cloud postgres table with federated query 【发布时间】:2021-11-19 05:27:12 【问题描述】:我正在尝试将 bigquery 表(目标)与具有联合查询的 google cloud postgres 表(源)合并。但是,bigquery 似乎不接受“using”子句中的联合查询。
Syntax error: Expected "(" or keyword SELECT or keyword WITH but got identifier "EXTERNAL_QUERY" at [3:9]
我的查询如下所示。
MERGE bigquery_dataset.bigquery_table TARGET
USING (
EXTERNAL_QUERY("projects/company-co/locations/us/connections/company","SELECT * FROM postgres_schema.postgres_table")
) SOURCE
ON target.id = source.id
WHEN MATCHED THEN ...
WHEN NOT MATCHED BY TARGET THEN ...
WHEN NOT MATCHED BY SOURCE THEN ...
对于此类功能是否有任何已知的解决方法?或者有没有其他方法可以执行这种类型的合并?
【问题讨论】:
【参考方案1】:根据您的要求,如果您想在外部数据源位于 Cloud PostgreSQL 实例中的 BigQuery 中运行联合查询,您需要使用 SQL 函数定义源数据集,即 EXTERNAL_QUERY
您得到的错误:“语法错误:预期的“(”或关键字 SELECT 或关键字 WITH 但在 [3:9] 得到标识符“EXTERNAL_QUERY”)是因为您错过了您的 EXTERNAL_QUERY 之前的 SELECT 语句。
根据doc,语法应该是:
SELECT * FROM EXTERNAL_QUERY(connection_id, external_database_query[, options]);
我尝试在 BigQuery 中运行联合查询,其中源位于 Cloud PostgreSQL 中,并且它按预期工作。
SQL 查询:
MERGE myproject.demo.tab1 TARGET
USING (
select * from EXTERNAL_QUERY("projects/myproject/locations/us-central1/connections/sqltobig", "SELECT * FROM entries;")
) SOURCE
ON target.entryID = source.entryID
WHEN MATCHED THEN
DELETE
WHEN NOT MATCHED THEN
INSERT(guestName, content, entryID)
VALUES(guestName, content, entryID)
【讨论】:
以上是关于使用联合查询将 bigquery 表与谷歌云 postgres 表合并的主要内容,如果未能解决你的问题,请参考以下文章