IICS CDI Mapping Designer入門 〜Structure Parser(構造パーサー)編〜
どうも!DA部の春田です。
Informatica Cloud Data Integration(以下、IICS)でデータ変換処理を構築するためのインターフェイス"Mapping"には、データの変換処理を簡単に実装するための様々なパーツが用意されています。今回は非構造化データを扱う際に便利なパーツ、Structure Parserについてご紹介していきます!
Structure Parserでは何ができるのか?
Structure Parserは、JSONやXMLといった非構造化データから、ログファイルやクリックストリーム、PDFやExcelファイルまで、あらゆるフォーマットのファイルを自動的にパースし好みの形式に出力できるパーツです。以下のリストが詳細です。
- Input
- Delimited files, for example, CSV files
- Machine generated files such as weblogs and clickstreams
- JSON files
- XML files
- ORC files
- Avro files
- Parquet files
- Microsoft Excel files
- Data within PDF form fields
- Data within Microsoft Word tables
- Output
- Relational
- JSON
- JSON Lines
- XML
- Avro
- Parquet
- ORC
前回の階層パーサー(Hierarchical Parser)では、非構造化データのパースに階層スキーマ(Hierarchical Schema)と呼ばれる静的なサンプルレコードが必要でしたが、Structure Parserでは使用するデータそのものに対して動的にスキーマ情報を得ることが可能です。ただし同じソースデータでも、Hierarchical ParserとStructure Parserでは出力データのグループ分けが異なってくる場合があるので注意が必要です。
事前準備
IICSおよび、Secure Agentの環境は構築できているとします。初めての方は、以下のエントリをご参照ください。
今回はJSONのサンプルデータをJSON Generatorというサービスを使って作成します。デフォルトの以下のフォーマットのままJSONデータを作成し、sample.json
として保存します。
[ '{{repeat(5, 7)}}', { _id: '{{objectId()}}', index: '{{index()}}', guid: '{{guid()}}', isActive: '{{bool()}}', balance: '{{floating(1000, 4000, 2, "$0,0.00")}}', picture: 'http://placehold.it/32x32', age: '{{integer(20, 40)}}', eyeColor: '{{random("blue", "brown", "green")}}', name: '{{firstName()}} {{surname()}}', gender: '{{gender()}}', company: '{{company().toUpperCase()}}', email: '{{email()}}', phone: '+1 {{phone()}}', address: '{{integer(100, 999)}} {{street()}}, {{city()}}, {{state()}}, {{integer(100, 10000)}}', about: '{{lorem(1, "paragraphs")}}', registered: '{{date(new Date(2014, 0, 1), new Date(), "YYYY-MM-ddThh:mm:ss Z")}}', latitude: '{{floating(-90.000001, 90)}}', longitude: '{{floating(-180.000001, 180)}}', tags: [ '{{repeat(7)}}', '{{lorem(1, "words")}}' ], friends: [ '{{repeat(3)}}', { id: '{{index()}}', name: '{{firstName()}} {{surname()}}' } ], greeting: function (tags) { return 'Hello, ' + this.name + '! You have ' + tags.integer(1, 10) + ' unread messages.'; }, favoriteFruit: function (tags) { var fruits = ['apple', 'banana', 'strawberry']; return fruits[tags.integer(0, fruits.length - 1)]; } } ]
以下のようにJSONデータのパスを記載したJSON_File.txt
も作成しておいてください。こちらはSourceから読み取るのに使用します。
PATH /home/infa/cm_haruta/sample.json
sample.json
とJSON_File.txt
は、Secure Agentの任意のディレクトリ配下に配置しておいてください。
IICSから、sample.json
とJSON_File.txt
をFlat Fileとして読み取るためのコネクションを作成します。データを配置したディレクトリに対して、コネクションを作成してください。
これで事前準備はOKです。
実際に使ってみた!
まずは左メニューバーの「New」をクリックして、Mappingを新規作成します。
Mappingデザイナーの画面が表示されたら、Sourceの設定を行います。Object
にJSON_FILE.txt
を選択してください。
もちろん、このままだとSourceのFields
には大した情報が含まれていません。PATH
というカラムにJSONデータへのパスが1行だけ入っている状態です。
次に、デザイナー上でStructure Parserをパレットからドラッグ&ドロップしてきます。
Structure Parserの要素は大きく6つ、General
、Structure Parser
、Incoming Fields
、Field Mapping
、Output Field
、Advanced
です。今回はそのうち、Structure Parser
、Field Mapping
、Output Field
の3つを主に使用します。まずはStructure Parser
のタブをクリックしてください。
Structure Parser
では、Intelligent Structure Modelというデータをパースするためのコンポーネントを定義します。事前に作成してある場合はSelect
から選択すればOKですが、ないのでNew
をクリックします。プルダウンでDesign New
とAuto-generate from sample file
の2つがありますが、Auto-generate from sample file
はDesign New
のショートカットのようなものです。初回なのでDesign New
から進めていきましょう。
Design New
をクリックすると、Intelligent Structure Modelの編集画面に入ります。NameはIntelligent Structure Model1
としておきます。Sample Fileに今回使用するsample.json
を指定し、Discover Structure
をクリックすると解析が始まります。
itemの+ボタンをクリックすると、以下のようにツリー構造で解析結果が展開されます。上のRelational Output
タブをクリックすれば、テーブルに変換したデータが右側に表示されます。
各エレメント(JSONのキー名だったもの)をクリックすると、データ型の詳細が表示されます。データ型はIICSが算出した一番確度の高いデータ型が選択されますが、プルダウンから任意のものを選択することもできます。明らかに違うものがあれば、事前に変更しておきましょう。
Save
すれば自動的にMappingの方に反映されます。Output AsはRelational
のままで進めていきます。
続いて、Field Mapping
のタブをクリックします。デザイナー上でSource
→Structure Parser
が接続されていないので、There is no incoming fields.
という表示が出ているかと思います。手始めに矢印を引っ張ってきて接続しましょう。
Field MappingにPATH
というカラムが追加されたので、これを右側のFilePath
のカラムへドラッグ&ドロップしてマッピングを行います。
Output Fields
のタブをクリックして出力カラムを確認します。先ほど作成したIntelligent Structure Modelにしたがって、出力形式が生成されます。一旦これでPreviewしてみましょう。
Preview前に、デザイナー上でStructure Parser
→Target
への矢印を引っ張っておいてください。Output Groupは今はとりあえずUnidentified
で大丈夫です。
設定後、Previewを実行するとこんなエラーが出る方がいるのではないでしょうか?これはIntelligent Structure Modelで決定したデータ型の長さ(Precision)があっていないということですので、どのカラムが超過してそうかあたりをつけます。
今回のデータでは、明らかに長いAbout
のカラムが超過していそうですね。こちらのPrecision
をひとまず9999
にしておきます。item_tags
とitem_friends
の2つのGroupに存在しているのでご注意を。
再度Previewを実行したら、今度はちゃんと出力されました、Output Groupは3つあり、JSONで配列が格納されていたtags
とfriends
の値にJOINする形でデータが構造化されています。この点が、Hierarchical Parserとの違いですね。
先ほど述べた通り、Outputの形式はRelationalだけでなくJSON Linesなどでも可能です!お手元で色々試してみてください。
最後に
実際触ってみて、Intelligent Structure ModelでJSONデータがツリー構造で可視化してくれるのが面白いなという感想を持ちました。
Developers.IOではその他の機能についても丁寧にご紹介していきたいとおもいますので、乞うご期待ください!