sqlおじさん(自称)がbigqueryのstandard sqlを使ってみた

50
http://gcpug.jp SQLおじさん(自称)がBigQueryの Standard SQLを使ってみた 熊野 良(Ryo Kumano) GCPUG Fukuoka 4th (2016/10/22)

Upload: kumano-ryo

Post on 09-Jan-2017

7.604 views

Category:

Engineering


6 download

TRANSCRIPT

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

ご清聴ありがとうございました。