(追記)2021年12月14日
こちらの記事で遥かに整理された方法が紹介されておりますので、併せてご覧下さい。執筆当時の私のSQLに対する理解の低さが露呈している本記事より間違いなくためになります。
どうも、最近、電子レンジ・IHヒーター・電気ポット・オーブンをフル稼働させ「こいつら全てを操って並列処理で料理してる俺、魔術師」と悦に浸っていたら、ブレーカーが落ちてしまった、分析官の岡部です。
データサイエンスで並列処理といえば
- 大規模データをものともしないGoogleのBigQuery
- そしてそのパワーを、プロSQLライターの力を借りることなく、簡単なGUI操作だけで処理を構成できるELT/ETLツールのMatillion
ですよね?
今をときめくデータサイエンス界のスターである彼らなら、私の繰り出す黒魔術にもブレーカーを落とすことなく耐えてくれることでしょう。
……とまあ、いささか無理矢理感のある導入ではありますが、本記事はMatillionの話です。(Matillionって何という方はこちらの記事をご覧ください)。
また、Matillion ETL for Google BigQueryを前提とします。
結論としては
- Rewrite Tableコンポーネントを使う(Table Outputコンポーネントは使わない)
これにつきます。以下はその詳細をくどくど説明しているだけなので、お急ぎの方は読む必要ありません。
実際にRewrite Tableコンポーネントでの出力を試してみてください。
Transformation Jobでのテーブル出力
MatillionはELTツールなので、生データを全て集約、その上でデータ整形していく思想で設計されています。*1 *2。
当然、生データはそのままだと分析に使えないので、例えば顧客IDで集約したり、トランザクションテーブルと顧客マスタを結合したりと、分析に使いやすい形に整形しなければいけません。通称前処理です。Matillionではこれら前処理はTransformation Jobで行っていきます。
さて、お望みの前処理が構築できたらお次はテーブル出力です。
Rewrite Tableコンポーネントを使って以下の2パターンのいずれかで記述します。Table Outputコンポーネントではないことに注意してください。
実は以前は(2)の方法で記述しなければならず、非常に初見者殺しだったのですが、
いつの間にか(1)の方法でもいけるようになってました。
(1)テーブル名をコンポーネントにベタ書きする
(2)出力テーブル名を変数としてコンポーネントの外部で設定する
それぞれ実際の画面を見ながら確認していきましょう。
1. テーブル名をコンポーネントにベタ書きする
下画像のようにRewrite Tableコンポーネントを選択、Target ProjectとTarget Datasetで出力先プロジェクトおよびデータセットを指定します。
そしてTarget Tableに出力したいテーブル名を記述する、これだけです。ここではtest_rewrite_tableとしました。
2. 出力テーブル名を変数としてコンポーネントの外部で設定する
まずはテーブル名の変数を定義します。
キャンバスの適当な位置で右クリック、Manage Job Variablesを選択してください。
Nameにテーブル名を入れる変数の名前を、Valueに出力テーブル名を記述します。
残りの設定は一旦そのままにしておいてください。
OKを押してポップアップを閉じ、再び1同様Rewrite Tableコンポーネントを編集していきましょう。
Target ProjectとTarget Datasetに関しては1と同じなのですが、Target Tableの設定が異なります。
Use Variablesにチェックを入れ、先ほど設定したtable_nameを選択してください。
結論
結論というか気をつけるポイントとしては
- Rewrite Tableコンポーネントを使う(Table Outputコンポーネントは使わない)
これに尽きるでしょう。
余談
テーブル出力するって、そんな簡単なことをわざわざブログに書かなくても……。
僕もそう思います。
しかし、実はこの件に関する質問、過去3回以上受けているのです。
データサイエンティストのDavid Robinson氏(David Robinson (@drob) | Twitter)によると、
「3回同じアドバイスをしたらそれはブログに書きなさい」とのことなのでこの方針に従っております。
かく言う僕自身、最初は全くやり方がわからず、「Viewを作りBig Queryのコンソール画面でテーブル化」みたいな無駄なやり方をしていました……。
しかしなぜそんなにわかりにくいのでしょう?
それはTable Outputなる超絶紛らわしいコンポーネントがあるからです。
しかもこいつ「すでに出力先テーブルは存在していなければならない」というクセモノ。
遊戯王でいうと
「このカードは通常召喚できない。自分の墓地の闇属性モンスターが3体の場合のみ特殊召喚できる。」
みたいなものです。死者蘇生では召喚できません。(間違っていたらすみません。)
個人的にはRewrite Tableと名前逆じゃねえか?と思います。
さらに僕がハマった当時は、
「Rewrite Tableコンポーネントを使った上で、テーブル名はJob Variablesで定義しなければならない」
みたいな仕様でした。
わかってしまえばなんてことはないので、ご参考になれば嬉しいです。
そしてもし、もっといいやり方がある、そんなやり方間違っている、という方がいればそっと教えていただけると助かります。
それでは快適なMatillionライフを。
*1:え?ETLじゃなくてELT?
→ https://it-trend.jp/etl/article/252-0002
*2:違いはわかった。でもMatillionの公式サイトに行くと、ETLってあるんだけど?
→ https://www.xplenty.com/jp/blog/matillion-vs-xplenty-ja/