web-dev-qa-db-ja.com

BigQueryでTABLE_QUERY()関数を使用するにはどうすればよいですか?

TABLE_QUERY関数に関するいくつかの質問:

  • 例は、クエリ文字列で_table_id_を使用することを示していますが、他のフィールドを使用できますか?
  • デバッグするのは難しいようです。使用しようとすると「補助クエリの評価エラー」が発生します。
  • TABLE_QUERY()はどのように機能しますか?
22
Jordan Tigani

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_関数を実行したときに返されるテーブルを確認することもできます。内部クエリをデバッグしたら、それらのテーブルに対する完全なクエリと一緒にまとめることができます。

48
Jordan Tigani

標準SQLに移行する人のための代替回答:

  • BigQuery Standard 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
3
Felipe Hoffa