IICS CDI Mapping Designer入門 〜Structure Parser(構造パーサー)編〜

Informatica Cloud Data IntegraionのMappingで使用できるパーツ「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.jsonJSON_File.txtは、Secure Agentの任意のディレクトリ配下に配置しておいてください。

IICSから、sample.jsonJSON_File.txtをFlat Fileとして読み取るためのコネクションを作成します。データを配置したディレクトリに対して、コネクションを作成してください。

これで事前準備はOKです。

実際に使ってみた!

まずは左メニューバーの「New」をクリックして、Mappingを新規作成します。

Mappingデザイナーの画面が表示されたら、Sourceの設定を行います。ObjectJSON_FILE.txtを選択してください。

もちろん、このままだとSourceのFieldsには大した情報が含まれていません。PATHというカラムにJSONデータへのパスが1行だけ入っている状態です。

次に、デザイナー上でStructure Parserをパレットからドラッグ&ドロップしてきます。

Structure Parserの要素は大きく6つ、GeneralStructure ParserIncoming FieldsField MappingOutput FieldAdvancedです。今回はそのうち、Structure ParserField MappingOutput Fieldの3つを主に使用します。まずはStructure Parserのタブをクリックしてください。

Structure Parserでは、Intelligent Structure Modelというデータをパースするためのコンポーネントを定義します。事前に作成してある場合はSelectから選択すればOKですが、ないのでNewをクリックします。プルダウンでDesign NewAuto-generate from sample fileの2つがありますが、Auto-generate from sample fileDesign 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のタブをクリックします。デザイナー上でSourceStructure Parserが接続されていないので、There is no incoming fields.という表示が出ているかと思います。手始めに矢印を引っ張ってきて接続しましょう。

Field MappingにPATHというカラムが追加されたので、これを右側のFilePathのカラムへドラッグ&ドロップしてマッピングを行います。

Output Fieldsのタブをクリックして出力カラムを確認します。先ほど作成したIntelligent Structure Modelにしたがって、出力形式が生成されます。一旦これでPreviewしてみましょう。

Preview前に、デザイナー上でStructure ParserTargetへの矢印を引っ張っておいてください。Output Groupは今はとりあえずUnidentifiedで大丈夫です。

設定後、Previewを実行するとこんなエラーが出る方がいるのではないでしょうか?これはIntelligent Structure Modelで決定したデータ型の長さ(Precision)があっていないということですので、どのカラムが超過してそうかあたりをつけます。

今回のデータでは、明らかに長いAboutのカラムが超過していそうですね。こちらのPrecisionをひとまず9999にしておきます。item_tagsitem_friendsの2つのGroupに存在しているのでご注意を。

再度Previewを実行したら、今度はちゃんと出力されました、Output Groupは3つあり、JSONで配列が格納されていたtagsfriendsの値にJOINする形でデータが構造化されています。この点が、Hierarchical Parserとの違いですね。

先ほど述べた通り、Outputの形式はRelationalだけでなくJSON Linesなどでも可能です!お手元で色々試してみてください。

最後に

実際触ってみて、Intelligent Structure ModelでJSONデータがツリー構造で可視化してくれるのが面白いなという感想を持ちました。

Developers.IOではその他の機能についても丁寧にご紹介していきたいとおもいますので、乞うご期待ください!