Matillionでテーブル出力する方法(Big Query)

どうも、最近、電子レンジ・IHヒーター・電気ポット・オーブンをフル稼働させ「こいつら全てを操って並列処理で料理してる俺、魔術師」と悦に浸っていたら、ブレーカーが落ちてしまった、分析官の岡部です。

データサイエンスで並列処理といえば

  • 大規模データをもろともしないGoogleのBigQuery

  • そしてそのパワーを、プロSQLライターの力を借りることなく、簡単なGUI操作だけで処理を構成できるELT/ETLツールのMatillion

ですよね?
今をときめくデータサイエンス界のスターである彼らなら、私の繰り出す黒魔術にもブレーカーを落とすことなく耐えてくれることでしょう。

、、、とまあ、いささか無理矢理感のある導入ではありますが、本記事はMatillionの話です。(Matillionって何という方は記事下部で補足しておりますので、そちらをご覧ください)。 また、Matillion ETL for Google BigQueryを前提とします。

結論としては

これにつきます。以下はその詳細をくどくど説明しているだけなので、お急ぎの方は読む必要ありません。 実際に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とTaget Datasetで出力先プロジェクト及びデータセットを指定します。 そしてTarget Tableに出力したいテーブル名を記述する、これだけです。ここではtest_rewrite_tableとしました。

f:id:gri-blog:20210606104957p:plain

2. 出力テーブル名を変数としてコンポーネントの外部で設定する

まずはテーブル名の変数を定義します。 キャンバスの適当な位置で右クリック、Manage Job Variablesを選択して下さい。 Nameにテーブル名を入れる変数の名前を、Valueに出力テーブル名を記述します。 残りの設定は一旦そのままにしておいて下さい。

f:id:gri-blog:20210606105320p:plain

f:id:gri-blog:20210606105337p:plain

OKを押してポップアップを閉じ、再び1同様rewrite Tableコンポーネントを編集していきましょう。 Target ProjectとTaget Datasetに関しては1と同じなのですが、Target Tableの設定が異なります。 Use Variablesにチェックを入れ、先ほど設定したtable_nameを選択して下さい。

f:id:gri-blog:20210606110057p:plain

結論

結論というか気をつけるポイントとしては

これに尽きるでしょう。

余談

テーブル出力するって、そんな簡単なことをわざわざブログに書かなくても、、、
僕もそう思います。
しかし、実はこの件に関する質問、過去3回以上受けているのです。
データサイエンティストのDavid Robinson氏( David Robinson (@drob) | Twitter )によると、 「3回同じアドバイスをしたらそれはブログに書きなさい」とのことなのでこの方針に従っております。

f:id:gri-blog:20210606105443p:plain

かく言う僕自身、最初は全くやり方がわからず、「Viewを作りBig Queryのコンソール画面でテーブル化」みたいな無駄なやり方をしていました。。。

しかしなぜそんなにわかりにくいのでしょう?
それはTable Outputなる超絶紛らわしいコンポーネントがあるからです。
しかもこいつ「すでに出力先テーブルは存在していなければならない」というクセモノ。

遊戯王でいうと
「このカードは通常召喚できない。自分の墓地の闇属性モンスターが3体の場合のみ特殊召喚できる。」
みたいなものです。死者蘇生では召喚できません。(間違ってたらすみません。)

個人的にはRewrite Tableと名前逆じゃねえか?と思います。
さらに僕がハマった当時は、
Rewrite Tableコンポーネントを使った上で、テーブル名はJob Variablesで定義しなければならない」
みたいな仕様でした。

わかってしまえばなんてことはないので、ご参考になれば嬉しいです。
そしてもし、もっといいやり方がある、そんなやり方間違っている、という方がいればそっと教えていただけると助かります。

それでは快適なMatillionライフを。

(補足)Matillionってなに?

Matillionってなに?なにがそんなにいいの?という方は例えば以下の記事をご覧ください

gri-blog.hatenablog.com

また、弊社開発の自動機械学習ツールForecastFlowとも連携できます Big Queryにデータ集約→その圧倒的計算パワーを活かして前処理→機械学習モデルの作成→訓練済みモデルの日次運用、といったことが簡単にできるようになります。 気になる方は以下のブログ及び動画をご覧ください

gri-blog.hatenablog.com

www.youtube.com

*1:え?ETLじゃなくてELT? → https://it-trend.jp/etl/article/252-0002

*2:違いはわかった。でもMatillionの公式サイト行くと、ETLってあるんだけど? → https://www.xplenty.com/jp/blog/matillion-vs-xplenty-ja/