【发布时间】:2014-05-09 05:02:51
【问题描述】:
关于 TABLE_QUERY 函数的几个问题:
- 示例显示在查询字符串中使用
table_id,是否还有其他可用字段? - 似乎很难调试。当我尝试使用它时,我收到“错误评估辅助查询”。
-
TABLE_QUERY()是如何工作的?
【问题讨论】:
-
以后也继续添加这样的问答。他们都是伟大的。 Google 在 BQ 团队工作。
标签: google-bigquery
关于 TABLE_QUERY 函数的几个问题:
table_id,是否还有其他可用字段?TABLE_QUERY() 是如何工作的? 【问题讨论】:
标签: google-bigquery
对于那些转向标准 SQL 的人的替代答案:
例如,要获得 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
【讨论】:
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_timeline 和github_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:自 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(...))