2014-03-29 62 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