如何在BigQuery中使用TABLE_QUERY()函数?

时间:2014-03-29 18:05:59

标签: google-bigquery

关于TABLE_QUERY函数的几个问题:

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

2 个答案:

答案 0 :(得分:47)

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样本表)并找到最常见的URL:

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__ metatable:

  • last_modified_time:自1970年1月1日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函数时返回的表。一旦调试了内部查询,就可以将它与完整查询放在一起进行查询。

答案 1 :(得分:3)

替代答案,对于那些前进到标准SQL的人:

  • BigQuery Standard SQL不支持TABLE_QUERY,但它支持表名的*扩展。
  • 扩展表名*时,可以使用元列_TABLE_SUFFIX缩小选择范围。
  • 带*的表扩展仅在所有表都具有兼容模式时有效。

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

public function companies() {
    return $this->belongsTo('App\Company')
}
相关问题