Webページのスクレイピングと分析・可視化で使用したJava製ETLツールPentaho Data Integration(以下PDI)について覚えたことについて記載する。
本記事はメモ程度の内容であり、情報の正確性については保証しない。必ず公式ドキュメントを参照すること。
データ変換の流れ
新規 → データ変換 を選択。ジョブは今回は使っていない。
PDIのデザインメニューの項目は種類が多いが、実際に使うものは入力、変換、出力、結合くらいで、あとはたまにフローやスクリプトを使う程度である。
基本的な使い方
処理の追加
デザインメニューから追加したい処理をダブルクリックするだけで追加できる。
もし既に設置したアイコンを選択した状態でダブルクリックすると、選択状態のアイコンと自動的に接続した状態で追加してくれる。
データフローの接続
アイコンを中クリックすると、接続の矢印を伸ばすことができる。この矢印を伸ばした状態で別のアイコンをクリックすると、新しいデータフローを作成することができる。
接続した線を左クリックするとそのフローを一時的に無効化することが可能。右クリックで削除を選択すれば、接続を削除できる。
プレビュー
アイコンを右クリックしてプレビューを選択すると、そのアイコンまでの処理時点での結果をプレビューすることができる。デフォルトは最初の100件のみ読み込むが、特定の条件に合致するレコードが出力されるまでデータを読み続けることができる。
個別のアイコンの説明
入力
CSV入力
CSVファイルを読み込む。フィールドを取得を選択すると、自動的にフィールド名や型情報を取得してくれる。
JSON 入力
PDI7 時点では入力ではなくInputに含まれている。
自動でフィールド情報を読み込んでくれず、JsonPath形式でスキーマ定義を与えてあげる必要があるため非常に面倒な上、一定の形式のJSONしか読み込むことができない。たとえば、 はてなブックマークAPIのはてなブックマーク件数取得APIは<個別url>: <個別カウント>
というJSON形式で返すが、JsonPathでは任意のキーの一覧を取得することができない。このような場合は、PDIの外で別途パースしてCSVに変換するか、PDIが読めるようなJSON形式に変換する必要がある。
変換
シーケンス追加
シーケンス番号を追加する。ユニークIDの付加に使える。シーケンスカウンタ名が実際に追加されるカラム名だが、それとは別に内部カウンタのカウンタ名という項目がある。このカウンタ名はデータ変換処理内で共通の変数として扱われるため、異なる2箇所で同じカウンタ名を使った場合、それらが生成する値は互いに異なるものとなる。通常ユニークIDの生成は独立して行うものであるので、カウンタ名はユニークなものを使う方がいいと思う。
定数追加
新しいカラムを作成し、それら全てに同じ値を追加する。今回はサービスIDの追加に使った(Qiitaは1、Adventarは2と決めて設計していたため)。
文字列オペレーション
トリムやパディングなどを行う。正規表現による処理は文字列オペレーションではなく、スクリプト→正規表現なので注意すること。
行整列
日本語訳が少し変だが、要するにソートのことである。
計算
アイコンが電卓なので単なる四則計算程度に思うかもしれないが、日付計算から改行コード削除、果てはレーベンシュタイン距離の計算までやってくれる超多機能アイコン。
選択/名前変更
必要なカラムを選択したり、名前を変更したりする。JOINを行うなどのときに不要なカラムが大量に増えるため、随時整理した方が見通しがよくなる。
重複行削除
名前の通り、重複行を削除する。前段でソートを実施することを忘れずに。
フロー
フィルター
特定条件でデータをフィルタする。条件のTRUE/FALSEで分岐可能。
結合
マージ結合
2つのフローをJOINする。INNER / LEFT OUTER / RIGHT OUTER / FULL OUTER を選択することが可能。
出力
テキストファイル出力
CSV形式で出力にはこの処理を選択する。
この処理内で出力するカラムを選択することができるが、出力直前の、すなわち完成されたデータは別の処理に流用する場合が多いので、直前に 選択/名前変更処理を行って、そこでカラムの調整を行い、出力時には単にフィールドを取得するで取得した内容をそのまま出力するだけの方がいい。
その他
ステップ間のレコード数
上部メニューの編集 → 設定 でデータ変換プロパティを表示し、その他 タブをクリックすると、ステップ間のレコード数 というプロパティがある。これが1ステップで取り扱う行数の上限となる。デフォルトは10000。
これは、10000行以上同時に読み込むことが必要な処理は実行できないことを意味する。特にJOINを行う場合は致命的となる。利用可能なメモリ量を見つつ、必要な分だけ増加させること。