BigQuery初心者を脱出したい1(テーブル作成~検索)
BigQuery初心者です。初心者脱出を図るために色々調べながら書いていきます。
同じような人の参考になればと思います。
BigQueryの費用について 2021/8/7時点
BigQueryを使おうと思った時に気になるのが費用だと思われるが、データのスキャン量に気を付けていればとんでもない高額請求をされることは無い、はず。。
費用は大きく以下の二つ。
・ストレージ利用料金
オペレーション | 料金(東京リージョン) | 詳細 |
---|---|---|
アクティブ ストレージ | $0.023 per GB | 毎月 10 GB まで無料。 |
長期保存 | $0.016 per GB | 毎月 10 GB まで無料。 |
・分析料金
オペレーション | 料金(東京リージョン) | 詳細 |
---|---|---|
クエリ(オンデマンド) | $6.00 per TB | 毎月 1 TB まで無料です。 |
分析料金がクエリを発行した時のスキャンデータ量と思われる。
当面大きなデータを扱わなければ無料の範囲内で利用できるはず。
ビッグデータを扱う際にスキャン量を節約するには、後述のパーティション分割テーブルを使う。
データセットを作成する
テーブルを作成したりデータを入れたりする前に、まずはデータセットというものを作成する必要があるようなので以下手順で作成していく。
GCPプロジェクトを作成しBigQueryへアクセス
SQLワークスペースが開くのでエクスプローラから自分のプロジェクトIDのメニューを選択し「データセットを作成」
入力項目を埋めてデータセットを作成する。
- データセットIDは適当に入力
- ロケーションはとりあえずTokyo(asia-northeast1)に設定
- デフォルトのテーブルの有効期限はいつの間にか消えてても困るのでこの手順では有効にしない。30 Daysとかに設定すればテーブル作成から30日後に自動で削除する、みたいな機能のよう。データを恒久的に貯めこむのではなくデータ一時処理用のテーブルを作成するときなどに使うのだと思う。
- 暗号化は気にする必要が無ければ「Googleが管理する暗号鍵」を選択
テーブルに入れるデータを準備する
CSV形式のデータを用意、今回は使用感を掴むため簡易なデータで。
users.csv
ID,Name,Birthday
1001,田中 太郎,1990-08-02
1002,鈴木 一郎,1990-05-03
1003,山田 隆史,1991-02-14
テーブルを作成する
データセットが作成出来たらテーブルを作成する。
作成したデータセットを選択し「開く」
「テーブルを作成」(+ボタン)を選択
今回はテーブルの作成元「アップロード」を選択して、ローカルからusers.csvを選択。それ以外は適当に入力して「テーブルを作成」を押下
※ヘッダ付きのCSVを使って「スキーマと入力パラメータ」を自動検出と選択しても、ヘッダ名が日本語だとフィールド名の自動入力を行ってくれないので注意
作成されたテーブルを選択するとアップロードしたCSVに合わせてフィールドやデータが自動作成されていることが分かる。
テーブルを検索する
テーブルが作成出来たらSQLを発行してデータを検索する。
作成したテーブルを選択して「クエリ」を押下
右にクエリウインドウが開く。ここでクエリ発行を行う。
SQLを発行する際のテーブル名の指定方法は以下のよう
プロジェクト名.データセット名.テーブル名
とりあえず以下のSQLで全件検索してみる
SELECT * FROM `avid-booster-xxxxx.dataset_test_01.users
「このクエリを実行すると、93Bが処理されます。」という実行計画が表示される。本テーブルの全体のデータ量が93Bなのでテーブルをフルスキャンしていることが分かる。
※
BigQueryの費用を考えるときに一番注意したいのがこの時のデータのスキャン量
データのスキャン量に応じてBigQueryは費用がかかるようになっている
今回は大したデータ量ではないので気にならないが、テラバイト、ペタバイトクラスのデータを扱う際に常にフルスキャンをさせていると費用がとんでもないことになるっぽい
※
テーブルのスキャン量を減らして出来るだけ費用を抑える為には、パーティション分割テーブルというものを使う
「実行」を押すと表形式で結果が出力される。
クエリ結果から「結果の保存」を押すと、様々な種類でデータをエクスポートできることが分かる。
スプレッドシートに保存したりBigQueryの別テーブルに保存したりと、GUI上でデータの処理が完結出来るのでとても便利そう。
※これ、ビッグデータの処理に限らず、ちょっとDB使いたいなくらいのデータ量のデータ処理時にとても便利なのでは??CloudSQLとかって立てるの面倒だし意外とお金かかるし。。
その他
一般的なDBで使えるようなSQL(サブクエリとか、結合とか)は大体使えるんだろうか?
サブクエリは使えるよう。
ストアドプロシージャとか分析関数とか、様々な機能があるみたいなので今後色々と試してみたい。
また色々試したら記事にしていきたいと思います。
Discussion