【问题标题】:How to create temporary table in Google BigQuery如何在 Google BigQuery 中创建临时表
【发布时间】:2014-01-07 13:35:36
【问题描述】:

有没有办法通过以下方式在 Google BigQuery 中创建临时表:

SELECT * INTO <temp table> 
FROM <table name> 

和我们在 SQL 中创建的一样吗?

对于复杂的查询,我需要创建临时表来存储我的数据。

【问题讨论】:

标签: google-bigquery


【解决方案1】:

2018 年更新 - DDL 的明确答案

借助 BigQuery 的 DDL 支持,您可以根据查询结果创建表 - 并在创建时指定其到期时间。例如,3 天:

#standardSQL
CREATE TABLE `fh-bigquery.public_dump.vtemp`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 3 DAY)
) AS
SELECT corpus, COUNT(*) c
FROM `bigquery-public-data.samples.shakespeare`
GROUP BY corpus

【讨论】:

    【解决方案2】:

    2019 年更新 -- 借助 BigQuery scripting(现在是 Beta 版),正式支持 CREATE TEMP TABLE。请参阅公共文档here。

    2018 年更新:https://stackoverflow.com/a/50227484/132438

    bigquery 中的每个查询都会创建一个带有结果的临时表。临时的,除非您为目标表命名,否则您可以控制其生命周期。

    使用 api 查看临时表名,或在查询时为您的表命名。

    【讨论】:

    • 我不想通过 API 创建临时表。我想在浏览器工具(bigquery.cloud.google.com)中查询时通过查询本身创建它。
    • 同样的事情。如果您在 web ui 上查看查询历史记录,您将看到您过去的每个查询获得的临时表名称。
    • 您还可以指定目标表(请参阅 UI 中的“启用选项”按钮);这可以让您为查询的目标表命名。无法通过 SELECT INTO 将结果写入表。
    • 我们可能会在我们的 JDBC 驱动程序中添加一些东西。由于我们使用的是自定义查询解析器,因此可以创建 INSERT INTO SELECT ... 我们需要做的就是设置 API 参数以将其存储到新表中,而不是临时表中。我们现在很忙,但如果我们有时间,这是改进 JDBC 驱动程序的一种方法。可以在以下位置找到:code.google.com/p/starschema-bigquery-jdbc
    • 你能在 SQL 中给它一个名字吗?还是只能通过 API 来实现?
    【解决方案3】:

    可以在"New Standard SQL" 中使用WITH 创建临时表。见WITH clause。

    谷歌给出的一个例子:

    WITH subQ1 AS (SELECT SchoolID FROM Roster),
         subQ2 AS (SELECT OpponentID FROM PlayerStats)
    SELECT * FROM subQ1
    UNION ALL
    SELECT * FROM subQ2;
    

    【讨论】:

    • 此答案虽然对某些用例可能有用,但并未解决原始问题。 WITH 不创建临时表——它是一个命名的子查询。大查询不会将 WITH 的结果具体化为表。每次引用命名的子查询时,都会再次执行它,这可能是原始问题试图避免的。请参阅答案中的 WITH 链接进行确认。
    • 这个答案是错误的,WITH 不会创建临时表。每当您调用 WITH 表时,都会运行查询。 cloud.google.com/bigquery/docs/reference/standard-sql/…
    • 这甚至可以在 BigQuery 中使用
    【解决方案4】:

    2019 年更新 -- BigQuery scripting 正式支持CREATE TEMP TABLE。请参阅公共文档here。

    CREATE TEMP TABLE Example
    (
      x INT64,
      y STRING
    );
    
    INSERT INTO Example
    VALUES (5, 'foo');
    
    INSERT INTO Example
    VALUES (6, 'bar');
    
    SELECT *
    FROM Example;
    

    【讨论】:

    • 您需要紧接在 CREATE 语句之前和之后的 Begin 和 End 语句,否则这是最简单的答案。
    • 如果您需要围绕创建开始/结束,这让我感到惊讶。您可以在没有开始/结束的情况下发布错误的查询吗?
    • 我无法运行 CREATE 语句,除非我在之前放置 Begin 并在之后放置 End 语句。如果我没有收到错误消息:“运行查询时出错,使用 CREATE TEMPORARY TABLE 需要脚本”
    【解决方案5】:

    要创建临时表,在使用 CREATE TABLE 语句时使用 TEMP 或 TEMPORARY 关键字,使用 CREATE TEMPORARY TABLE 需要脚本,所以最好从 begin 语句开始。

    Begin CREATE TEMP TABLE <table_name> as select * from <table_name> where <condition>; End ;

    【讨论】:

    • 请记住,临时表只存在于它所在的脚本的生命周期中,所以上面的“技巧”与 BEGIN/END 没有多大意义。其余的已经在云的答案中了!
    • 我还注意到,如果您在 BigQuery 控制台中收到“使用 CREATE TEMPORARY TABLE 需要脚本”错误,那么您只需确保突出显示多个语句并结束每个语句用分号。显然,这符合“脚本”的条件。
    【解决方案6】:

    在 GCP bigquery 中创建临时表的示例

    CREATE TABLE  `project_ID_XXXX.Sales.superStore2011` 
    OPTIONS(
      expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
    ) AS
    SELECT 
      Product_Name,Product_Category, SUM(profit) Total_Profit,  FORMAT_DATE("%Y",Order_Date) AS Year
    FROM 
      `project_ID_XXXX.Sales.superStore` 
    WHERE
      FORMAT_DATE("%Y",Order_Date)="2011"
    GROUP BY 
      Product_Name,Product_Category,Order_Date
    ORDER BY 
       Year, Total_Profit DESC
    LIMIT 5 
    

    【讨论】:

      【解决方案7】:

      以SQL为例

      SELECT name,count FROM mydataset.babynames 
        WHERE gender = 'M' ORDER BY count DESC LIMIT 6 INTO mydataset.happyhalloween;
      

      最简单的命令行等价物是

      bq query --destination_table=mydataset.happyhalloween \ 
      "SELECT name,count FROM mydataset.babynames WHERE gender = 'M' \
      ORDER BY count DESC LIMIT 6"
      

      请参阅此处的文档: https://cloud.google.com/bigquery/bq-command-line-tool#createtablequery

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多