9 複合データ型およびHDFSファイル形式の操作

この章では、拡張されたデータ形式のサポートおよび複合型のサポートについて概要を説明します。

この章の内容は次のとおりです。

HDFSファイル形式

サポートされている形式

ODIは、様々な形式のHDFSファイル・データの読取りと書込みが可能です。サポートされているHDFSファイル形式は、Json、Avro、区切りおよびParquetです。この形式は、HDFSデータ・ストアの「記憶域」タブで指定します。Avroファイル、JSONファイルまたはParquetファイルをリバースエンジニアリングする場合は、「記憶域」タブでスキーマを指定する必要があります。リバースエンジニアリング処理では、スキーマのみを使用します。HDFSファイル自体にアクセスすることはありません。区切りHDFSファイルは、リバースエンジニアリングできません。属性(HDFSデータ・ストアの「属性」タブ内)は手動で追加する必要があり、パラメータ(フィールド・セパレータなど)は「記憶域」タブで定義する必要があります。

AvroファイルをHiveにロードする場合は、Avroスキーマ・ファイル(.avsc)をAvro HDFSファイルと同じHDFSの場所にコピーする必要があります(「記憶域」パネルの「スキーマ」に指定したものと同じファイル名を使用します)。

複合型

JSON形式、Avro形式およびParquet形式には、配列やオブジェクトなどの複合データ型を含めることができます。リバースエンジニアリングのフェーズで、それらの属性の「データ型」フィールドが「複合」に設定され、複合型の定義が属性の「データ形式」フィールドに保存されます。この定義の構文は、Avroでスキーマの定義に使用されるものと同じです。この情報は、マッピング・エディタでマッピングにフラット化コンポーネントを追加するときにODIによって使用されます。

表9-1 HDFSファイル形式

ファイル形式 リバースエンジニアリング 複合型のサポート Hiveへのロード Sparkへのロード Sparkからの書込み

Avro

可(スキーマは必須)

可(スキーマは必須)

可(バッチ・モードのみ)

区切り

不可

不可

JSON

可(スキーマは必須)

Parquet

可(スキーマは必須)

可(バッチ・モードのみ)

可(バッチおよびストリーミング)

表9-2 複合型

Avro Json Hive Parquet

レコード

オブジェクト

構造型

レコード

列挙

該当なし

該当なし

列挙

配列

配列

配列

配列

マップ

該当なし

マップ

マップ

共用体

該当なし

共用体

共用体

固定

該当なし

該当なし

固定

マッピングでの複合データ型の操作

フラット化コンポーネントを決定する複合型、ネスト型、およびユーザー定義メタデータの使用に関する情報を示します。

Oracle Data Integratorは、複雑な構造を持つ入力データを処理して、標準データ型を使用した同じデータのフラット化された表現を生成できるフラット化コンポーネントを提供しています。入力データは、様々な形式(Hive表やJSON HDFSファイルなど)にすることができます。

マッピングにフラット化コンポーネントを追加するときには、コンポーネントのアップストリームからフラット化する属性を選択します。

SparkおよびHiveのフラット化コンポーネントには、その他の実装にはない、いくつかの高度なユーザービリティ機能があります。具体的には、アップストリーム・ノードからフラット化する属性を選択すると、フラット化された属性が自動的に作成されます。これは、HiveおよびHDFSのリバースエンジニアリング・プロセスによって属性の「データ形式」プロパティにある複合型の定義を取得することで可能になります。このプロパティは、HiveまたはHDFSデータ・ストアの「属性」タブで確認できます。フラット化コンポーネントの「コレクション」および「構造」プロパティも、属性の定義に基づいて自動的に設定されます。その後は、null複合データを処理するかどうかに基づいて、手動で「NULLを含む」プロパティを設定するだけです。 一部のテクノロジ、とりわけSparkは、null複合属性が含まれるレコードを削除できます。

表9-3 フラット化コンポーネントのプロパティ

フラット化プロパティ 説明 HiveおよびHDFSに対する自動検出(リバースエンジニアリングが使用された場合)

NULLを含む

null複合データを処理するかどうかを示します。

不可

コレクション

複合型の属性が配列などのコレクションであるかどうかを示します。

構造

複合型が単なるスカラー型のコレクションではなく、オブジェクト、レコードまたは構造であるかどうかを示します。

フラット化コンポーネントごとにフラット化できる複合型属性は1つのみです。フラット化コンポーネントは、複数の属性をフラット化することや、ネストされたデータ型が関与する状況でネストの次のレベルにアクセスすることを目的として連鎖させることができます。

フラット化コンポーネントおよびそれに関連するKMの使用の詳細は、次の項を参照してください。

「Hiveマッピングでの複合型に対するフラット化の使用」の例では、フラット化コンポーネントの連鎖の例を示しています。Flatten_Director複合型属性は、MOVノードからアップストリームのMOVIE_DIRECTOR属性に設定されます。その時点で、NAMEAGEが自動的にFlatten_Directorに作成されます。Flatten_RatingsFlatten_Directorの後に続いて、複合型属性としてFlatten_Director.RATINGSを使用します。その後で、rating属性とinfo属性が自動的に追加されます。

Hive複合データ型

Hiveには、次の複合データ型があります。

  • 配列

  • マップ

  • 構造体

  • 共用体

Hiveマッピングでの複合型に対するフラット化の使用

フラット化コンポーネントは、Hiveマッピングで複合型を処理するために使用されます。

次に示すJSONスニペットについて説明します。このスニペットは、次の2つの複合型を持つソースです。

  • MOVIE_DIRECTORフィールド: NameとAgeで構成されている構造体。

  • RATINGSフィールド: レーティングの配列。各レーティングには、ratingフィールドとinfoフィールドが含まれています。

{"MOVIE_ID":11,"MOVIE_NAME":"The Lobster","MOVIE_DIRECTOR":{"NAME":"Yorgos Lanthimos","AGE":43},"RATINGS":[{"rating":7,"info":"x"},{"rating":5,"info":"x"}]}
{"MOVIE_ID":12,"MOVIE_NAME":"Green Room","MOVIE_DIRECTOR":{"NAME":"Jeremy Saulnier","AGE":40},"RATINGS":[{"rating":4,"info":"x"},{"rating":3,"info":"x"}]}
{"MOVIE_ID":13,"MOVIE_NAME":"Louder Than Bombs","MOVIE_DIRECTOR":{"NAME":"Joachin Trier","AGE":42},"RATINGS":[{"rating":1,"info":"x"},{"rating":2,"info":"x"}]}
...

データの移入先のHive表は、MOVIE_DIRECTOR複合構造体から抽出されるNAMEと、RATINGS配列から求められるレーティングの平均値を必要とします。

そのためには、次のものをフラット化するマッピングが必要になります。

  • MOVIE_DIRECTORフィールド: NAMEを抽出できるようにします。

  • RATINGS配列: 行ごとの個別のレーティングの平均を計算できるようにします。

このマッピングは次の図のようになります。

図9-1 複合型をフラット化するマッピング

図9-1の説明が続きます
「図9-1 複合型をフラット化するマッピング」の説明

データが移入されたHive表は、次に示す図のようになります。

図9-2 データが移入されたHive表

図9-2の説明が続きます
「図9-2 データが移入されたHive表」の説明

Cassandra複合データ型

Cassandraには、次の複合データ型があります。

  • マップ

  • セット

  • リスト

  • タプル

  • ユーザー定義型

マップ

マップはキーと値のペアのセットです。このキーは一意になります。マップは、キーでソートされます。

セット

セットは、一意の値のコレクションです。セットは、値に基づいてソートされます。

リスト

リストは、一意でない値のコレクションです。リスト内の位置でソートされます。

タプル

タプルは、型と位置が指定されたフィールドの固定長のセットです。32768個のフィールドに対応可能で、ユーザー定義型のかわりとして使用できます。

ユーザー定義型

ユーザー定義型(UDT)は、作成、更新および削除が可能な複合データ型です。

Cassandraは、LKM Spark to Cassandraと汎用のSQL KMで使用できます。

Apache Cassandra DataDirect JDBCドライバの複合型の処理は、Hive JDBCドライバの場合と異なります。そのため、Cassandra複合型を使用するマッピングの作成は、Hiveマッピングの場合とわずかに異なります。この実例を示すために、Cassandraで定義したUDTとリストを使用する表について説明します。

  • UDTにはApache Cassandra DataDirect JDBCドライバでアクセスできます。これは、このJDBCドライバがUDTをフラット化して、通常の表の列としてスカラー型を投影するためです。これにより、マッピングでフラット化コンポーネントを使用する必要がなくなります。Cassandraデータ・ストアでは余分な列もフラット化されていて、マッピングで直接使用できることがわかります。

  • Apache Cassandra DataDirect JDBCドライバで、値のコレクション(Cassandraのリスト、Hiveの配列)にアクセスできます。Apache Cassandra DataDirect JDBCドライバは、構造体を正規化して、子表によってコレクション型を投影します。元の表のリバースエンジニアリング時に、コレクション用の追加のデータ・ストアが作成されます。その後で、これら2つの表をマッピングで結合する必要があります。

  • ODIのネストされた型にはアクセスできません。

ODIでのCassandraのリストおよびユーザー定義型の処理方法

ここでは、ODIでのCassandraのリストおよびユーザー定義型の処理方法の例を示します。

次のUDTとリストが含まれているスキーマmovieRating2について考えてみます。

  • movie_director属性は、NameとAgeで構成されているUDTです。

  • ratings属性は、整数のリストです。

create type director_object (name text, age int);

create table movieRating2 (movie_name text, movie_id int PRIMARY KEY, movie_director frozen<director_object>, ratings list<int);

INSERT INTO movierating2 (movie_id, movie_name, movie_director, ratings)
VALUES (1,'Lord of the Rings',('Peter Jackson',32),[1,2]);
INSERT INTO movierating2 (movie_id, movie_name, movie_director, ratings)
VALUES (2,'King Kong',('Peter Jackson',32),[1,2]);
INSERT INTO movierating2 (movie_id, movie_name, movie_director, ratings)
VALUES (3,'District 9',('Peter Jackson',32),[1,3]);
INSERT INTO movierating2 (movie_id, movie_name, movie_director, ratings)
VALUES (4,'The Birds',('Alfred Hitchcock',140),[1,4]);
INSERT INTO movierating2 (movie_id, movie_name, movie_director, ratings)
VALUES (5,'Psycho',('Alfred Hitchcock',140),[1,2,8]);
INSERT INTO movierating2 (movie_id, movie_name, movie_director, ratings)
VALUES (6,'Local Hero',('Bill Forsyth',56),[1,9]);
INSERT INTO movierating2 (movie_id, movie_name, movie_director, ratings)
VALUES (7,'Restless Natives',('Michael Hoffman',45),[1]);
INSERT INTO movierating2 (movie_id, movie_name, movie_director, ratings)
VALUES (8,'Trainspotting',('Danny Boyle',12),[1,4]);

ODIでmovierating2表をリバースエンジニアリングすると、次の図のようになります。

図9-3 リバースエンジニアリングしたmovierating2

図9-3の説明が続きます
「図9-3 リバースエンジニアリングしたmovierating2表」の説明

この表には、ratings属性が含まれていません。ただし、JDBCドライバによってmovierating2_ratingsという仮想表が公開されます。

この仮想表をODIでリバースエンジニアリングすると、次の図のようになります。

図9-4 リバースエンジニアリングしたmovierating2_ratings

図9-4の説明が続きます
「図9-4 リバースエンジニアリングしたmovierating2_ratings表」の説明

この例のターゲットHDFSファイルには、movie_director UDTから抽出される名前と、ratingsリストから求められる平均値が必要になります。

そのために、movierating2表とmovierating2_ratings表を結合して、movieごとのratingsの平均を求めるマッピングが必要になります。

このマッピングは次の図のようになります。

図9-5 movierating2表とmovierating2_ratings表を結合するマッピング

図9-5の説明が続きます
「図9-5 movierating2表とmovierating2_ratings表を結合するマッピング」の説明

ここで重要な点は、Cassandra複合型の場合、フラット化コンポーネントはマッピング内の複合フィールドにアクセスする必要がないということです。同様のHiveマッピング(「Hiveマッピングでの複合型に対するフラット化の使用」を参照)とは設計が異なっていることがわかります。

マッピングの実行後、ターゲットHDFSファイルは次のようになります。

hdfs dfs -cat AvgRating.json/part-r-00000-4984bb6c-dacb-4ce1-a474-dc5641385e9f
{"MOVIE_NAME":"District 9","MOVIE_ID":3,"DIRECTOR_NAME":"Peter Jackson","AVG_RATINGS":2}
{"MOVIE_NAME":"Lord of the Rings","MOVIE_ID":1,"DIRECTOR_NAME":"Peter Jackson","AVG_RATINGS":1}
{"MOVIE_NAME":"The Birds","MOVIE_ID":4,"DIRECTOR_NAME":"Alfred Hitchcock","AVG_RATINGS":2}
{"MOVIE_NAME":"Restless Natives","MOVIE_ID":7,"DIRECTOR_NAME":"Michael Hoffman","AVG_RATINGS":1}

hdfs dfs -cat AvgRating.json/part-r-00001-4984bb6c-dacb-4ce1-a474-dc5641385e9f
{"MOVIE_NAME":"Psycho","MOVIE_ID":5,"DIRECTOR_NAME":"Alfred Hitchcock","AVG_RATINGS":3}
{"MOVIE_NAME":"Trainspotting","MOVIE_ID":8,"DIRECTOR_NAME":"Danny Boyle","AVG_RATINGS":2}
{"MOVIE_NAME":"King Kong","MOVIE_ID":2,"DIRECTOR_NAME":"Peter Jackson","AVG_RATINGS":1}
{"MOVIE_NAME":"Local Hero","MOVIE_ID":6,"DIRECTOR_NAME":"Bill Forsyth","AVG_RATINGS":5}

HDFSファイルからHiveへのデータのロード

HDFSファイルからHiveにデータをロードするステップを示します。

  1. HDFSデータ・モデルを作成します。
  2. HDFSデータ・ストアを作成します。
    詳細は、「HDFSデータ・サーバーの定義」を参照してください。
  3. 「記憶域」パネルで、「記憶域形式」を設定します。
    デリミタ付きを除いたすべてにスキーマが必要です。

    注意:

    • 「行形式」が「区切り」に設定されている場合、「フィールドの終了元」「コレクション・アイテムの終了元」,および「マップ・キーの終了元」を設定します。

    • HDFSファイルがAvroの場合は、HDFSファイルと同じHDFSディレクトリにAvroスキーマが存在している必要があります。

  4. ソースとしてHDFSファイルを、ターゲットとしてHiveファイルを使用して、マッピングを作成します。
  5. マッピングの物理ダイアグラムで指定されているLKM HDFS File to Hive Load DataIKM Hiveを使用します。

    注意:

    リバースエンジニアリングの詳細は、「Hive表のリバースエンジニアリング」を参照してください。

HDFSファイルからSparkへのデータのロード

HDFSファイルからSparkにデータをロードするステップを示します。

  1. 複合ファイルのデータ・モデルを作成します。
  2. HIVE表のデータ・ストアを作成します。
  3. 「記憶域」パネルで、「記憶域形式」を設定します。
  4. ソースおよびターゲットとしてHDFSファイルを使用して、マッピングを作成します。
  5. マッピングの物理ダイアグラムで指定されているLKM HDFS to SparkおよびLKM Spark to HDFSを使用します。

    注意:

    AVRO形式の場合は、スキーマ・ファイルの場所を指定できます。リバースエンジニアリングの詳細は、「Hive表のリバースエンジニアリング」を参照してください。AvroファイルをSparkにロードするには、AVSCファイルありとAVSCファイルなしの2つの方法があります。