【问题标题】:How do I use the TABLE_QUERY() function in BigQuery?如何在 BigQuery 中使用 TABLE_QUERY() 函数?
【发布时间】:2014-05-09 05:02:51
【问题描述】:

关于 TABLE_QUERY 函数的几个问题:

  • 示例显示在查询字符串中使用table_id,是否还有其他可用字段?
  • 似乎很难调试。当我尝试使用它时,我收到“错误评估辅助查询”。
  • TABLE_QUERY() 是如何工作的?

【问题讨论】:

  • 以后也继续添加这样的问答。他们都是伟大的。 Google 在 BQ 团队工作。

标签: google-bigquery


【解决方案1】:

对于那些转向标准 SQL 的人的替代答案:

  • BigQuery 标准 SQL 不支持 TABLE_QUERY,但支持表名的 * 扩展。
  • 扩展表名 * 时,您可以使用元列 _TABLE_SUFFIX 来缩小选择范围。
  • 仅当所有表都具有兼容的架构时,使用 * 的表扩展才有效。

例如,要获得 2010 年至 2014 年全球 NOAA GSOD 的平均温度:

#standardSQL
SELECT AVG(temp) avg_temp, _TABLE_SUFFIX y
FROM `bigquery-public-data.noaa.gsod_20*` #every year that starts with "20"
WHERE _TABLE_SUFFIX BETWEEN "10" AND "14" #only years between 2010 and 2014
GROUP BY y
ORDER BY y

【讨论】:

    【解决方案2】:

    TABLE_QUERY() 函数允许您编写一个 SQL WHERE 子句,该子句被评估以查找要在哪些表上运行查询。例如,您可以运行以下查询来计算 publicdata:samples 数据集中所有表中超过 7 天的行数:

    SELECT count(*)
    FROM TABLE_QUERY(publicdata:samples,
        "MSEC_TO_TIMESTAMP(creation_time) < "
        + "DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')")
    

    或者您可以运行它来查询名称中包含“git”的所有表(即github_timelinegithub_nested 示例表)并找到最常见的网址:

    SELECT url, COUNT(*)
    FROM TABLE_QUERY(publicdata:samples, "table_id CONTAINS 'git'")
    GROUP EACH BY url
    ORDER BY url DESC
    LIMIT 100
    

    尽管功能非常强大,TABLE_QUERY() 还是很难使用。 WHERE 子句必须指定为字符串,这可能有点尴尬。此外,它可能很难调试,因为当出现问题时,您只会收到错误“评估辅助查询时出错”,这并不总是有帮助。

    工作原理:

    TABLE_QUERY() 本质上执行两个查询。当您运行 TABLE_QUERY(&lt;dataset&gt;, &lt;table_query&gt;) 时,BigQuery 会执行 SELECT table_id FROM &lt;dataset&gt;.__TABLES_SUMMARY__ WHERE &lt;table_query&gt; 以获取要在其上运行查询的表 ID 列表,然后对这些表执行您的实际查询。

    该查询的__TABLES__ 部分可能看起来不熟悉。 __TABLES_SUMMARY__ 是一个元表,其中包含有关数据集中表的信息。您可以自己使用此元表。例如,查询SELECT * FROM publicdata:samples.__TABLES_SUMMARY__ 将返回有关publicdata:samples 数据集中表的元数据。

    可用字段:

    __TABLES_SUMMARY__ 元表的字段(在TABLE_QUERY 查询中都可用)包括:

    • table_id:表名。
    • creation_time:自 1970 年 1 月 1 日 UTC 以来的时间,以毫秒为单位,创建表。这与表格中的creation_time 字段相同。
    • type:无论是视图(2)还是常规表(1)。

    以下字段在TABLE_QUERY()可用,因为它们是__TABLES__ 但不是__TABLES_SUMMARY__ 的成员。出于历史兴趣和部分记录__TABLES__ 元表,将它们保留在这里:

    • last_modified_time:自 1970 年 1 月 1 日 UTC 以来的时间,以毫秒为单位,表已更新(元数据或表内容)。请注意,如果您使用 tabledata.insertAll() 将记录流式传输到您的表,这可能会过时几分钟。
    • row_count:表中的行数。
    • size_bytes:表的总大小(以字节为单位)。

    如何调试

    为了调试您的 TABLE_QUERY() 查询,您可以执行与 BigQuery 相同的操作;也就是说,您可以自己运行元表查询。例如:

    SELECT * FROM publicdata:samples.__TABLES_SUMMARY__ 
    WHERE MSEC_TO_TIMESTAMP(creation_time)  < 
       DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')
    

    让您不仅可以调试查询,还可以查看运行TABLE_QUERY 函数时会返回哪些表。调试完内部查询后,您可以将其与对这些表的完整查询放在一起。

    【讨论】:

    • TABLE_QUERYs 可以以任何方式连接吗?我已经尝试过,JOIN,但在查询中似乎都不能接受。似乎他们应该是,-able,不是吗?
    • 是的,您可以用 , 连接它们。您可能需要包含子选择,如SELECT * FROM (SELECT * FROM TABLE_QUERY(...)), (SELECT * FROM TABLE_QUERY(...))
    • 嗨,乔丹。如果 project_id 包含“-”连字符,则 TABLE_QUERY 失败。例如项目数据:dataset_id。这是有问题的。有什么建议吗?
    • 太棒了!谢谢乔丹!
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多