http://gcpug.jp
SQLおじさん(自称)がBigQueryの
Standard SQLを使ってみた
熊野 良(Ryo Kumano)
GCPUG Fukuoka 4th (2016/10/22)
http://gcpug.jp
熊野 良 (Ryo Kumano)
Twitter: @ryok0607
2014/06 〜 株式会社グルーヴノーツ 入社
- 肩書きは 「サーバエンジニア・データベースエンジニア」
- GCP上で稼動している自社サービスのインフラ設計・構築・運用を担当
- 2015/08 〜 東京 -> 福岡に移住
過去(5年以内)に携わった業務
- 国内大手B2Cサイトのインフラ設計・構築・運用・DB設計・チューニング
など
自己紹介
http://gcpug.jp
BigQueryの
Standard SQL
使ってますか??
ところで…
http://gcpug.jp
知ってた。
A. ほとんど使ってない
http://gcpug.jp
- BigQuery Standard SQLとは
- 使い方
- 利用するメリット
- Legacy SQLからの移行
Agenda
http://gcpug.jp
- SQL:2011に準拠している
- 一般的なSQL構文で実行可能になった。
- 入れ子(nested)や繰り返し(repeated)データにも対応
- これまでと同様に非正規形のデータ保持が可能。
- 従来のBigQueryのSQLはLegacy SQLという呼び方に
- Legacy扱いとか嫌な予感しかしない。
- が、まだあわてるような時間じゃない(はず)。
BigQuery Standard SQLとは
http://gcpug.jp
Web UI: Use Legacy SQLのチェックを外す。
Standard SQLの使い方(Web UI)
http://gcpug.jp
CLI: --nouse_legacy_sql をつける
Standard SQLの使い方(CLI)
http://gcpug.jp
API: useLegacySql を false に設定する
Standard SQLの使い方(API)
http://gcpug.jp
- WITH句が利用できる
- ユーザ定義関数が利用できる
- SELECT句にサブクエリが利用できる
- 相関サブクエリが利用できる
- 配列(ARRAY)や構造体(STRUCT)が利用できる
- 時間データの操作にtime zoneが利用できる
- time zoneを持たない時間データ型が利用できる
- DML文が利用できる (2016年10月現在beta)
利用するメリット
http://gcpug.jp
従来のVIEWをWITH句で定義できる。
利用するメリット: WITH句が利用できる
Legacy SQL Standard SQL
VIEW
Query
http://gcpug.jp
従来のUDF(js)をまとめてQueryで定義できる
利用するメリット: ユーザ定義関数が利用できる
Legacy SQL Standard SQL
UDF
Query
http://gcpug.jp
ちなみに Lgeacy SQLのチェックを外すと
UDF Editor ボタンはdisableになります。
利用するメリット: ユーザ定義関数が利用できる
Legacy SQL Standard SQL
http://gcpug.jp
SELECT句でサブクエリを直接実行可能
利用するメリット: SELECT句にサブクエリが利用できる
Legacy SQL Standard SQL
VIEW
Query
http://gcpug.jp
サブクエリから外のFROM句のtableを参照できる
利用するメリット: 相関サブクエリが利用できる
Standard SQL
http://gcpug.jp
EXISTSも使えるようになった!
(コストさがるのかな?)
利用するメリット: 相関サブクエリが利用できる
Standard SQL
http://gcpug.jp
Result
ARRAY なし STRUCT なし
利用するメリット: 配列(ARRAY)や構造体(STRUCT)が利用できる
Standard SQL
http://gcpug.jp
Result
xに ARRAY あり STRUCT なし
利用するメリット: 配列(ARRAY)や構造体(STRUCT)が利用できる
Standard SQL
http://gcpug.jp
Result
ARRAY なし STRUCT あり
利用するメリット: 配列(ARRAY)や構造体(STRUCT)が利用できる
Standard SQL
http://gcpug.jp
Result
ARRAY あり STRUCT あり
利用するメリット: 配列(ARRAY)や構造体(STRUCT)が利用できる
Standard SQL
http://gcpug.jp
Asia/Tokyoと指定すると日本時間の表示が可能
利用するメリット: 時間データの操作にtimezoneが利用できる
Standard SQL
http://gcpug.jp
TIMESTAMP関数にtime zoneを渡せる
利用するメリット: 時間データの操作にtimezoneが利用できる
Standard SQL Result
TIMESTAMP関数のformatが厳密になったので注意!(後述)
http://gcpug.jp
TIMESTAMP型と異なりtimezone は保持しない。
- DATE (YYYY-[M]M-[D]D)
- TIME ([H]H:[M]M:[S]S[.DDDDDD])
- DATETIME (YYYY-[M]M-[D]D [H]H:[M]M:[S]S[.DDDDDD])
TIMESTAMPとDATETIMEを混ぜると事故る。どちらか
に寄せる設計を心がけましょう。
利用するメリット: timezoneを持たない時間データ型が利用できる
http://gcpug.jp
DML文: INSERT / UPDATE / DELETE
利用するメリット: DML文が利用できる(beta)
http://gcpug.jp
注意点: トランザクションがサポートされてない
オペミスしてもROLLBACKできないよ!
やるときは腹を括って実行しましょう。
注意点: トランザクションがサポートされていない
http://gcpug.jp
注意点: QuotaのCAPが渋い
注意点: QuotaのCAPが渋い
http://gcpug.jp
注意点: INSERT文はcolumnの指定が必須
注意点: INSERT文はcolumnの指定が必須
http://gcpug.jp
注意点: UPDATEとDELETEのQuota値が同じ
一度も実行していないDELETE文もQuota上限となった。
注意点: UPDATEとDELETEのQuota値が同じ
UPDATE文を49回以上実行し、Quota上限となったことを確認。
http://gcpug.jp
利用するメリット: DML文が利用できる
【公式】MySQLのdumpデータからBQにload可能
https://cloud.google.com/bigquery/docs/loading-data-sql-dml#loading_data_using_sql_dml
これInsert文を1行ずつbqで実行してるだけやん...
http://gcpug.jp
JSONかCSVでやれ
BQにINSERT文実行すると2sec/recordくらいかかるよね?
http://gcpug.jp
DML文の使いどころ
クソみたいなDML文をどう使うのか?
ログデータは性質上、改竄はできない。
マスタデータの更新であればワンチャンある。
つまり“なかむら式マスタ更新”からの卒業。
参考: http://qiita.com/satoru_mag/items/fb233c188dd63f1aafff
http://gcpug.jp
新規QueryをStandard SQLで書く。
⇨ 可能な限りやっていきましょう!
既存のLegacy SQLをStandard SQLで書き直す。
⇨
Legacy SQLからの移行
http://gcpug.jp
ちょっと
待ってほしい!
Legacy SQLからの移行
http://gcpug.jp
- 型名の変更 (INTEGER,RECORD,REPEATED)
- TIMESTAMP型のFORMATを厳密にする
- REQUIREDのcolumnをNULLABLEに変更
- FROM句の[]を``に、:を.に置き換える
- ワイルドカード関数廃止の対応
- SELECT句の最後の,禁止
- Tableの和結合をUNIONに置き換える
- 関数の置き換え
etc...
Legacy SQLからの移行TODO
http://gcpug.jp
型名の変更
http://gcpug.jp
Standard SQLはTIMESTAMPを
YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD] [time zone]]
形式で明示的に表記する必要がある。
Legacy SQLでOKであった以下はエラーとなる。
YYYY/[M]M/[D]D [H]H:[M]M:[S]S
YYYY-[M]M-[D]D [H]H:[M]M
TIMESTAMP型のformat
http://gcpug.jp
Standard SQLではREQUIREDの属性のcolumnに
データを格納しようとするとエラーとなる。
Invalid schema update.
Field col1 has changed mode from REQUIRED to NULLABLE
Standard SQL使う場合は
NULLABLEに変換しましょう。
REQUIREDのcolumnをNULLABLEに変更
http://gcpug.jp
Legacy SQL Standard SQL
FROM句の[]を``に、:を.に置き換える
http://gcpug.jp
Standard SQLはワイルドカード関数を利用できない。
- TABLE_DATE_RANGE
- TABLE_DATE_RANGE_STRICT
- TABLE_QUERY
Legacy SQLからStandard SQLへの移行方法
1. FROM句から関数呼び出しを削除する
2. WHERE句で _TABLE_SUFFIX を指定する
ワイルドカード関数廃止の対応
http://gcpug.jp
Legacy SQL Standard SQL
ワイルドカード関数廃止の対応
http://gcpug.jp
SQLと同様に以下の条件が使用可能
- =
- <>
- (NOT) IN
- BETWEEN A AND B
_TABLE_SUFFIXに使える条件
http://gcpug.jp
Legacy SQL Standard SQL
SELECT句の最後の,禁止
http://gcpug.jp
Legacy SQL Standard SQL
Tableの和集合をUNIONに置き換え
http://gcpug.jp
関数の置き換え
http://gcpug.jp
配列周りの変更が割とある。
SQLを置き換えていくの、正直しんどい。
スライド作るのも正直しんどい
etc...
http://gcpug.jp
Legacy SQLから
Standard SQLに
置き換える必要あんの?
っていうか
http://gcpug.jp
推奨はするが必須ではない、とのこと。
移行に対する公式見解はこちら
じゃあ、移行しなくていいんじゃね?
http://gcpug.jp
移行するもしないも
自己責任で!
(まとまってなくてスイマセン)
じゃあ、移行しなくていいんじゃね?
http://gcpug.jp
- Standard SQL どんどん使っていこう!
- 既存Legacy SQL Queryの移行判断は難しい。
- SQLおじさん達はBQに入門していこう!
まとめ
http://gcpug.jp
ご清聴ありがとうございました。

SQLおじさん(自称)がBigQueryのStandard SQLを使ってみた