1. CraveOwl

    Posted

    CraveOwl
Changes in title
+BigQuery Storage APIを使ってみた
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,102 @@
+# はじめに
+
+[基本的な機械学習の手順:②データを準備しよう](https://qiita.com/CraveOwl/items/f1eae0dea959137ef526)では、BigQueryで作ったテーブルをPytohn環境にPandas Dataframe形式で取り込む処理をしてきました。
+
+ただ、テーブルのサイズが大きくなると、結構時間がかかってしまいます。
+たぶん、そんな悩みを持つ方が多かったのでしょう。そこで出てきたのが、BigQuery Storage APIという新たなサービス。
+
+一説には7~8倍も速いと聞きましたが、どうなのでしょう。試してみたいと思います。
+
+# 分析環境
+Google BigQuery
+Google Colaboratory
+
+# 参考にしたサイト
+
+[BigQuery Storage API を使用して BigQuery データを pandas にダウンロードする](https://cloud.google.com/bigquery/docs/bigquery-storage-python-pandas?hl=ja)
+
+# 対象とするデータ
+用いるテーブルは、`myproject.mydataset.mytable`という約100MBのテーブルです。
+それを、下記の様に全件取ってくるだけというシンプルな処理で、Pandas Dataframe形式で取り込みます。
+
+```python
+query="SELECT * FROM `myproject.mydataset.mytable`
+```
+
+# 1.BigQuery 標準API
+まずは、これまでも使っているBigQueryの標準APIでやってみます。
+
+```python
+import time
+from google.cloud import bigquery
+start = time.time()
+
+client = bigquery.Client(project="myproject")
+df = client.query(query).to_dataframe()
+
+elapsed_time = time.time() - start
+```
+
+約120秒で処理できました。まあ、これくらいなら許容範囲ですが。
+
+# 2.Pandas read_gbq
+BigQueryのAPIを使わなくても、Pandasの機能でできるよね。ということで、そちらも試してみます。
+
+```python
+import time
+import pandas as pd
+
+start = time.time()
+
+df = pd.io.gbq.read_gbq(query, project_id="myproject", dialect="standard")
+
+elapsed_time = time.time() - start
+```
+
+約135秒で処理が完了。BigQueryのAPIより少し遅くなっていますね。
+BigQueryの標準APIでも、Pandasの機能に比べると、何か工夫がされているようです。
+
+
+# 3.BigQuery Storage API
+そして、今回のテーマであるBigQuery Storage APIの出番です。
+Colabでライブラリーをimportしようとしたら、ライブラリーが無いよと言われてしまったので、まずはinstallから。
+
+```python
+pip install --upgrade google-cloud-bigquery-storage
+```
+
+と、インストールするとランタイムの再起動を求めるメッセージが。時々他のライブラリーでも出ますが、ちょっと面倒ですね。
+
+```
+WARNING: The following packages were previously imported in this runtime:
+ [google]
+You must restart the runtime in order to use newly installed versions.
+```
+
+さて、ランタイムを再起動して、改めてライブラリーをimportして実行します。
+
+```python
+import time
+from google.cloud import bigquery
+from google.cloud import bigquery_storage
+start = time.time()
+
+client = bigquery.Client(project="myproject")
+bqstorageclient = bigquery_storage.BigQueryStorageClient()
+df3 = (
+ client.query(query)
+ .result()
+ .to_dataframe(bqstorage_client=bqstorageclient)
+)
+
+elapsed_time = time.time() - start
+```
+実行時間は、なんと驚異の約12秒。標準APIの7~8倍どころか、10倍出てます。
+偶然かと思って、何度かやってみましたが、1~2秒程度の誤差はあるものの、ほぼこのスピードで完了しました。
+
+# おわりに
+
+予想よりもかなり速い結果が返ってきて、ビックリしました。
+普段の10倍速ければ、数GBとかのデータも短時間で取り込むことが可能ですね。(その後のPythonでの処理が重そうですが)
+
+普通にBigQueryを回すのに加えて、$1.10 per TBと費用が掛かるので、乱発はできませんが、テーブルが大きすぎてデータ取り込みに何十分も待たないといけない、というときには使っていきたいサービスですね。