データウェアハウスvsスクリプト データ前処理の適切な選択
普段、BigQueryからSQLで取得したデータを、Pythonで処理しながらデータ分析に利用しています。
データ前処理をする際に、これはデータウェアハウス(BigQuery)で行うべきか、スクリプト(Python)で行うべきか、と悩むことがたびたびあったので、整理してみました。
BigQueryなどのデータウェアハウスが得意な前処理
データベースのネイティブ機能(where, group by, join等)として提供されている処理は、データウェアハウスのほうが最適化されていて、高速に実行できます。
また、BigQuery、Redshiftなどの現代のデータウェアハウスの多くは分散アーキテクチャを採用しているため、大量のデータを効率的に処理することができます。データの読み込み、クエリの実行、書き込みなどの作業を複数のノードに分散させて実行するアーキテクチャです。
データウェアハウスはスケーラビリティにも優れているため、データ量が増えても処理速度を維持することが可能で、ローカルマシンのようにリソースが不足する心配もありません。
具体的には、次のような処理はデータウェアハウスに向いています。
- データのフィルタリング
- データの集計
- データの結合
- データベース固有の関数を使用する処理
データベース固有の関数というのは、たとえばBigQueryでは次のようなものです。
- REGEXP_CONTAINS: 文字列が正規表現にマッチするか判定する
- ST_DISTANCE: 地理空間データ間の距離を計算する
- GENERATE_ARRAY: 指定した範囲とステップ間隔で配列を生成する
- ML.PREDICT: 組み込みの機械学習モデルで予測する
上記以外にもいろいろあります。
こういった処理はスクリプトでも実装することができますが、処理結果を使ってさらに集計やフィルタリングなどの処理をしたい場合は、データウェアハウス側で完結させたほうが楽な気がします。
Pythonなどのスクリプトが得意な前処理
複雑なデータ変換が必要な場合はPythonなどのスクリプトのほうが楽に実装できます。
特にPythonには前処理に役立つライブラリが多いです。機械学習のための前処理、たとえばカテゴリ変数のエンコーディングやデータのスケーリング(正規化や標準化など)は、スクリプトで実装したほうが楽ですし、一般的なようです。
また、データを可視化して理解しながら前処理の方針を考える、といった場合もスクリプトのほうが向いていると思います。matplotlib、seaborn、plotlyなどのライブラリが使用できます。
まとめると、次のような前処理はスクリプトに向いています。
- 複雑なデータ変換
- 特徴量エンジニアリング
- 正規化や標準化などのスケーリング
- データの可視化
複雑な集計処理はどちらで行うべきか
複雑な集計処理は、自分はデータウェアハウスで行っていました。
SQLのほうが得意、という個人的な事情もあります。
少し調べてみたところ、複雑な集計処理もデータウェアハウスで行うという方針で問題はなさそうでした。
理由は前述の通り、データウェアハウスのほうが大量のデータを効率的に処理することができるからです。とはいえ、Pythonには便利な関数が多いので、SQLで処理するのが困難な場合は、ローカルマシンのリソースに余裕があるのならスクリプトで処理しても特に問題はないように思います。
複雑な集計処理をデータウェアハウスで行う利点
- 大量のデータを効率的に処理できる
- スケーラビリティに優れている
複雑な集計処理をスクリプトで行う利点
- 複雑な処理を比較的容易に実装できる
- 複雑なSQLを書かずに済むので可読性が高い
- データ前処理から機械学習へ連携が容易
まとめると上記のようになりそうです。
Discussion