Upload
kumano-ryo
View
7.605
Download
6
Embed Size (px)
Citation preview
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
- SQL:2011に準拠している
- 一般的なSQL構文で実行可能になった。
- 入れ子(nested)や繰り返し(repeated)データにも対応
- これまでと同様に非正規形のデータ保持が可能。
- 従来のBigQueryのSQLはLegacy SQLという呼び方に
- Legacy扱いとか嫌な予感しかしない。
- が、まだあわてるような時間じゃない(はず)。
BigQuery Standard SQLとは
http://gcpug.jp
- WITH句が利用できる- ユーザ定義関数が利用できる- SELECT句にサブクエリが利用できる- 相関サブクエリが利用できる- 配列(ARRAY)や構造体(STRUCT)が利用できる- 時間データの操作にtime zoneが利用できる- time zoneを持たない時間データ型が利用できる- DML文が利用できる (2016年10月現在beta)
利用するメリット
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
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
注意点: トランザクションがサポートされてない
オペミスしてもROLLBACKできないよ!
やるときは腹を括って実行しましょう。
注意点: トランザクションがサポートされていない
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
DML文の使いどころ
クソみたいなDML文をどう使うのか?
ログデータは性質上、改竄はできない。
マスタデータの更新であればワンチャンある。
つまり“なかむら式マスタ更新”からの卒業。
参考: http://qiita.com/satoru_mag/items/fb233c188dd63f1aafff
http://gcpug.jp
新規QueryをStandard SQLで書く。
⇨ 可能な限りやっていきましょう!
既存のLegacy SQLをStandard SQLで書き直す。
⇨
Legacy SQLからの移行
http://gcpug.jp
- 型名の変更 (INTEGER,RECORD,REPEATED)- TIMESTAMP型のFORMATを厳密にする- REQUIREDのcolumnをNULLABLEに変更- FROM句の[]を``に、:を.に置き換える- ワイルドカード関数廃止の対応- SELECT句の最後の,禁止- Tableの和結合をUNIONに置き換える- 関数の置き換え
etc...
Legacy SQLからの移行TODO
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
Standard SQLはワイルドカード関数を利用できない。
- TABLE_DATE_RANGE- TABLE_DATE_RANGE_STRICT- TABLE_QUERY
Legacy SQLからStandard SQLへの移行方法
1. FROM句から関数呼び出しを削除する2. WHERE句で _TABLE_SUFFIX を指定する
ワイルドカード関数廃止の対応
http://gcpug.jp
- Standard SQL どんどん使っていこう!
- 既存Legacy SQL Queryの移行判断は難しい。
- SQLおじさん達はBQに入門していこう!
まとめ