IICS CDI Mapping Designer入門 〜Hierarchy Parser(階層パーサー)編〜

Informatica Cloud Data IntegraionのMappingで使用できるパーツ「Hierarchy Parser」についてご紹介します。

どうも!DA部の春田です。

Informatica Cloud Data Integrationでデータ変換処理を構築するためのインターフェイス"Mapping"には、データの変換処理を簡単に実装するための様々なパーツが用意されています。今回は非構造化データを扱う際に便利なパーツ、Hierarchy Parserについてご紹介していきます!

Hierarchy Parserでは何ができるのか?

Hierarchy Parserでは、JSONやXMLといった階層型の非構造化データをリレーショナル型に変換して出力することができます。非構造化データのパースには、階層スキーマ(Hierarchical schema)と呼ばれるサンプルのレコードのような物が必要ですが、その分深めにネストされたJSONもしっかりパースすることが可能です。

事前準備

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も合わせて作成します。今回はデモなので、文字列や数値の長さは適当で構いません。以下の場合、文字列は長さ225、数値は小数なしの15桁で定義されます。実運用の際には、文字数・桁数や少数点などをきっちり合わせた上で階層スキーマを作成しましょう。sample_schema.jsonというファイル名で保存します。

[{
    "_id": "X",
    "index": 9,
    "guid": "X",
    "isActive": "X",
    "balance": "X",
    "picture": "X",
    "age": 9,
    "eyeColor": "X",
    "name": "X",
    "gender": "X",
    "company": "X",
    "email": "X",
    "phone":  "X",
    "address":  "X",
    "about": "X",
    "latitude": 9,
    "longitude": 9,
    "tags": [
        "X"
    ],
    "friends": [
        {
            "id": 9,
            "name": "X"
        }
    ],
    "greeting": "X",
    "favoriteFruit": "X"
}]

最後にもう一つ、JSONデータのパスを記載したテキストファイルを作成します。デザイナー上のSourceから直接JSONを読み込んでも、上手くスキーマ情報が反映されないためですね。このような場合は、ファイルのパスだけ指定した以下のようなファイルを作成しておきます。ファイル名はJSON_File.txtとしておいてください。

PATH
/home/infa/cm_haruta/sample.json

これで、sample.json sample_schema.json JSON_File.txtという3つのファイルが用意できたかと思います。このうち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行だけ入っている状態です。

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

Hierarchy Parserのタブの数は全部で7つ、General Incoming Fields Input Settings Input Field Selection Field Mapping Output Fields Advancedと、他のパーツに比べたらかなり多いですね…!ただ、今回使うのはInput Settings Input Field Selection Field Mappingの3つのみです。

まずはInput Settingsのタブをクリックし、スキーマの設定を行います。Input TypeBufferは、Input自体にデータが含まれている場合に選択します。今回のInputにはファイルパス情報しか含まれていないため、Fileを選択してHierarchy Parserの中でファイルを開くようにしておきます。Schemaには、新しくHierarchical Schemaというコンポーネントを作成します。Newをクリックしてください。

Hierarchical Schemaの編集画面が出るので、Schema/Sample Fileに先ほど用意したsample_schema.jsonを指定します。

念のためValidateをクリックして中身に問題がないかチェックしておきましょう。OKをクリックします。

作成したHierarchical Schemaを保存したら、Mappingの画面に戻ります。SchemaSelectをクリックし、作成したHierarchical Schema1を選択します。

スキーマの設定はこれで完了です。続いて、Input Field Selectionをクリックしてください。There are no incoming fields.という表記の通りInputが設定されていない場合は、デザイナー上でSourceからHierarchy Parserへ矢印をドラッグして引っ張っておきましょう。

Incoming FieldsのField Nameに追加されたPATHというカラムを、Hierarchical Schema Input FieldsのInputというカラムへドラッグ&ドロップし、マッピングを行います。

その後、Field Mappingのタブをクリックすると、以下のような階層構造の情報が表示されるはずです。(何も表示されない場合は、一旦Mappingを保存して開き直してみてください。)

Element Nameの最上位にあるrootArray左のプルダウンをクリックし、Map all descendantsをクリックすると、右側のRelational Fieldsにカラム情報が自動で挿入されます。

今回のJSONの構造上、データはroottags_Groupfriendsの3つに分かれます。配列データがあった場合に自動でGroup化されるようですね。

出力されるデータのスキーマ情報は、Output Fieldsタブからまとめて変更することができます。今回は何もいじりません。

最後に、Previewで出力データを確認してみましょう。Previewの前に、Mappingの構造上、Hierarchy ParserからTargetへの接続が必要です。デザイナー上で矢印を引っ張ると、どのグループをTargetに流すか選択するポップアップが表示されます。無難にrootを選択しておきましょう。Targetを複数用意すれば、他のGroupのデータも並行して出力可能です。

良い感じに変換できてます!

最後に

JSONを構造化データに変換したい需要はかなり高めだと思います。何かAPIを叩いたレスポンスを処理したい場合は、階層パーサーが使えると覚えておいてください!

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