自回答の転記:
「GCP ってナニ」「BigQuery ってナニ」状態から、でも実際にプロジェクト作成したり、API キー発行したりしつつ、調べてみた
短い答え
Legacy SQL で書く場合、 legacy_sql: true
を設定するか、あるいは標準のSQL 構文に沿ったクエリを投げましょう
調べたこと
BigQuery には2種類の構文が存在している
- Standard
- Legacy
それぞれ構文が異なる部分があり、BigQuery 以外で使われている一般的なSQL 構文(SQL 2011 標準との互換性)で書けるため、Standard への移行を勧めている
たとえば DATE_ADD()
- Standard: 関数と演算子 | BigQuery | Google Cloud Platform
- Legacy: クエリ リファレンス | BigQuery | Google Cloud Platform
まず判り易いのが、受け付ける引数の数が3つ→2つに変わってる...!!
Legacy:
-- Timestamp 型で日付情報を受け、数値、単位で計算する SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), 5, "YEAR")
Standard:
-- Date 型で日付情報を受け、INTERVAL と数値, 単位を指定することで計算する SELECT DATE_ADD(DATE "2008-12-25", INTERVAL 5 DAY)
クエリ例(Legacy & Standard)
それぞれをRuby で書いた場合(クライアントのセットアップなどの記述は省略)
# Legacy SQL query_string = %(SELECT DATE_ADD( TIMESTAMP('2012-10-01 02:03:04'), 5, 'YEAR' ) AS MyDate ) query_job = bigquery.query_job(query_string, legacy_sql: true) # (結果の出力をするコードを書くと得られる値) # => {:MyDate=>2017-10-01 11:03:04 +0900}
# Standard SQL query_string = %(SELECT DATE_ADD( DATE(TIMESTAMP('2012-10-01 02:03:04')), INTERVAL 5 YEAR ) AS MyDate ) query_job = bigquery.query_job(query_string) # (結果の出力をするコードを書くと得られる値) # => {:MyDate=>2017-10-01 11:03:04 +0900}
Tips: %()
構文でクエリを記述すると、エスケープ処理を考えずに '
, "
が気兼ねなく使える
legacy_sql
オプションについて
legacy_sql: true
指定ができるオプションに関しては、検索してると出てきたりする
- google-cloud-ruby/bigquery.rb at master · GoogleCloudPlatform/google-cloud-ruby
- google-cloud-ruby/CHANGELOG.md at master · GoogleCloudPlatform/google-cloud-ruby : 0.24.0/2017-03-03 の変更で有効になった
Links
- google-cloud-ruby/bigquery.rb at master · GoogleCloudPlatform/google-cloud-ruby
- google-cloud-ruby/CHANGELOG.md at master · GoogleCloudPlatform/google-cloud-ruby
- 標準 SQL への移行 | BigQuery | Google Cloud Platform
- Standard: 関数と演算子 | BigQuery | Google Cloud Platform
- Legacy: クエリ リファレンス | BigQuery | Google Cloud Platform