【问题标题】:How to refer a temporary table inside EXTERNAL_QUERY() function of the GCP BigQuery?如何在 GCP BigQuery 的 EXTERNAL_QUERY() 函数中引用临时表?
【发布时间】:2022-10-25 18:55:59
【问题描述】:

ERROR IMAGE HERE 我正在使用 GCP BigQuery 的 EXTERNAL_QUERY 函数。这个想法是从两个独立的 GCP Spanner 数据库中检索数据,并在一个大 SQL 查询中处理这些数据。 EXTERNAL_QUERY 函数将此外部数据提供给主查询(EXTERNAL_QUERY("<db_path>", "<SQL query>"))。 主查询执行从选择数据开始到临时表,然后在 EXTERNAL_QUERY 的第二个参数中引用该临时表。但是这种方法不起作用,因为我作为字符串提供给 EXTERNAL_QUERY 的 SQL 查询不能使用任何临时表。那么是否可以在 EXTERNAL_QUERY 函数中引用临时表?

我在 GCP 坞站中没有发现任何关于此问题的信息。当然,我可以从外部表中检索所有行并处理这些数据,但这种方法效率不高。

【问题讨论】:

    标签: sql google-cloud-platform google-bigquery google-cloud-spanner


    【解决方案1】:

    您可以在 BigQuery 中完成这一切吗?

    
    WITH transactions as (
       SELECT user_id
       FROM EXTERNAL_QUERY("connection_string",
       "SELECT user_id, id FROM transactions")
    ),
    das as (
      SELECT user_id
      FROM EXTERNAL_QUERY("connection_string",
      "SELECT user_id FROM destination_accounts WHERE status = 'PENDING'"
      )
    )
    SELECT
      user_id,
      COUNT(DISTINCT transactions.id)
    FROM
      das
    JOIN 
      transactions
    USING 
      (user_id)
    GROUP BY 
      user_id;
    

    您的外部事务查询是在 GCP Spanner 上执行的,因此它对das 一无所知。

    【讨论】:

    • 谢谢你的回答,彼得!您的查询是有效的,并且工作正常。但这并不能解决我的问题。在您的情况下,查询从外部表的选定列中检索所有数据,并且可能很大。许多不同的微服务使用这个单独的数据库来存储用户数据,而我的应用程序只使用了其中的一部分。所以这种方法效率不高,而且成本更高。我考虑将das 数据存储在某种变量中,然后将其放入EXTERNAL_QUERY 函数中
    【解决方案2】:

    据我了解,无法链接来自不同数据库的表,我们所能做的就是操作字符串。

    所以这是我的解决方案。首先,您需要从一个远程数据库中选择数据到一个临时表中,然后您可以使用该表中的键列表创建一个字符串,并将其插入到 IN() 子句中,以用于将发送到第二个远程的查询D B。

    像这样

    BEGIN 
    
    DECLARE USER_IDS STRING;
    DECLARE SELECT_TRANSACTIONS_QUERY STRING;
    
    CREATE TEMP TABLE users AS
        SELECT userId FROM EXTERNAL_QUERY(
          "projects/<project>/locations/<location>/connections/<connection>",
          "SELECT userId FROM users;"
        );
    
    SET USER_IDS = CONCAT("'", ARRAY_TO_STRING(ARRAY(SELECT userId FROM users), "', '"), "'");
    
    SET SELECT_TRANSACTIONS_QUERY = CONCAT('SELECT * FROM transactions WHERE userId IN(', USER_IDS, ')');
    
    EXECUTE IMMEDIATE
    """
      SELECT * FROM EXTERNAL_QUERY("projects/<project>/locations/<location>/connections/<connection>", ?);
    """
    USING SELECT_TRANSACTIONS_QUERY;
    
    END;
    

    所有这些都可以保存为一个过程并由后端的名称触发

    【讨论】:

      猜你喜欢
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多