2014-03-29 42 views
22

一对夫妇的有关TABLE_QUERY功能问题:如何在BigQuery中使用TABLE_QUERY()函数?

  • 的例子显示在查询字符串中使用table_id,是否有其他方式可用?
  • 这似乎很难调试。当我尝试使用它时,出现“评估子查询时出错”。
  • TABLE_QUERY()如何工作?
+2

不断增加,例如Q&作为未来过。他们都是伟大的。 Google在BQ团队工作。 – Pentium10

回答

45

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')") 

或者你可以运行此查询过那些在“混帐”的所有表名字(这是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(<dataset>, <table_query>)时,BigQuery执行SELECT table_id FROM <dataset>.__TABLES_SUMMARY__ WHERE <table_query>以获取表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:时间,以毫秒为单位自1/1/1970 UTC,该表被更新(或元数据或内容表)。请注意,如果您使用tabledata.insertAll()将记录流式传输到表格,这可能会过时几分钟。
  • row_count:表中的行数。
  • size_bytes:表格的总字节数。

如何调试

为了调试TABLE_QUERY()查询,你可以做到这一点的BigQuery做同样的事情;也就是说,您可以自己运行metatable查询。例如:

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

您不仅可以调试您的查询,但也看到,当您运行TABLE_QUERY函数将返回哪些表。一旦你对内部查询进行了调试,你就可以将这些查询放在这些表上。

+0

可以将'TABLE_QUERY's以任何方式连接起来吗?我已经尝试过''''和'JOIN',但在查询中的这一点上都不可接受。看起来他们应该是',' - 可以,不是? – woodardj

+2

是的,你可以连接它们,。你可能需要包装在一个子选择中,如'SELECT * FROM(SELECT * FROM TABLE_QUERY(...)),(SELECT * FROM TABLE_QUERY(...))' –

+0

嗨乔丹。如果project_id包含“ - ”连字符,则TABLE_QUERY失败。例如project-data:dataset_id。这是有问题的。有什么建议么? – cgnorthcutt

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