BigqueryのELTがめちゃくちゃ便利だった

ELTとは

ELTとはExtract/Load/Transformの頭文字を取っています。

(データ収集/データ転送/データ加工)

python機械学習をしたい時に大容量データを扱うことがあります。このデータを使用するには加工が必須になりますが、自分の環境上で大規模データを加工しようとすると「加工処理が終わらない」なんてことがしばしばあります。C言語でデータ加工をしても良いですが、学習コストが高い & 複雑な処理のコードを書くのに多くの時間が取られてしまう可能性があります。そこで、時間がかかる加工処理を自分の環境上で行うのではなくクラウド上でデータを加工する方法を試してみました。

ちなみに加工後に転送はETLと言います。ELTとETLのT(加工)とL(転送)の順番が違います。

 

- ELTとは (大規模データ加工でおすすめ)

データ収集 --> クラウド上にデータ転送 ---> クラウド上でデータ加工

- ETLとは  (従来の手法)

データ収集 ---> ローカルでデータ加工 ---> クラウド上にデータ転送

GCPのBigquery

GCPのBigQueryで 大規模データを加工を試みます。MySQLBiguqeryのUDFでデータ加工をします。MySQLBiguqeryのUDFは学習コストかなり低いです。

 

UDFでカテゴリ関数を作成し、カテゴリ変数を0か1で返す例

CREATE TEMP FUNCTION category(x STRING, y STRING)
RETURNS INT64
LANGUAGE js AS """
if (x == y) {
return 1;
} else {
return 0;
}
""";

select
r.dataid
, category(r.nj, '初日') AS nj_1
, category(r.nj, '2日目') AS nj_2
, category(r.nj, '3日目') AS nj_3
, category(r.nj, '4日目') AS nj_4
, category(r.nj, '5日目') AS nj_5
, category(r.nj, '6日目') AS nj_6
, category(r.nj, '最終日') AS nj_7

 

全体で約5GBを処理してみましたが、5分程度で処理が終了しました。ここの時間はデータ量とUDFが複雑度に依存しそう。

ローカルでは何百倍も処理時間がかかったので大規模なデータはBigQueryで処理した方が良いかもしれないです。

DataFlowのETLでも良いのでは?

 ETLとELTの使い分けは必要かなと思います。「生ログがネストしている」、「欠損を表現する文字がN/Aだったり空白だったりバラバラ」な場合はELTを採用してます。