TABLE_QUERY関数に関するいくつかの質問:
table_id
_を使用することを示していますが、他のフィールドを使用できますか?TABLE_QUERY()
はどのように機能しますか?TABLE_QUERY()
関数を使用すると、クエリを実行するテーブルを見つけるために評価されるSQL WHERE
句を記述できます。たとえば、次のクエリを実行して、7日より古い_publicdata:samples
_データセット内のすべてのテーブルの行をカウントできます。
_SELECT count(*)
FROM TABLE_QUERY(publicdata:samples,
"MSEC_TO_TIMESTAMP(creation_time) < "
+ "DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')")
_
または、これを実行して、名前に「git」が含まれるすべてのテーブル(_github_timeline
_および_github_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()
は基本的に2つのクエリを実行します。 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)か。次のフィールドは、___TABLES__
_のメンバーであるが、___TABLES_SUMMARY__
_のメンバーではないため、TABLE_QUERY()
ではnot使用できます。それらは、歴史的な関心のために、そして___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
_関数を実行したときに返されるテーブルを確認することもできます。内部クエリをデバッグしたら、それらのテーブルに対する完全なクエリと一緒にまとめることができます。
標準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