使用联合查询将 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 表合并的主要内容,如果未能解决你的问题,请参考以下文章

将 github 存储库与谷歌云存储桶同步

BigQuery 从 Android 加载数据的时间过长

使用谷歌云数据流执行谷歌 Bigquery 查询

BigQuery 数据与谷歌分析

从谷歌云存储中的 csv 加载数据作为 bigquery 'in' 查询

谷歌云bigquery成本