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の使用の詳細は、次の項を参照してください。
-
Oracle Data Integratorでの統合プロジェクトの開発のフラット化コンポーネントの作成
「Hiveマッピングでの複合型に対するフラット化の使用」の例では、フラット化コンポーネントの連鎖の例を示しています。Flatten_Director
複合型属性は、MOV
ノードからアップストリームのMOVIE_DIRECTOR
属性に設定されます。その時点で、NAME
とAGE
が自動的にFlatten_Director
に作成されます。Flatten_Ratings
はFlatten_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配列: 行ごとの個別のレーティングの平均を計算できるようにします。
このマッピングは次の図のようになります。
データが移入された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
表をリバースエンジニアリングすると、次の図のようになります。
この表には、ratings
属性が含まれていません。ただし、JDBCドライバによってmovierating2_ratings
という仮想表が公開されます。
この仮想表をODIでリバースエンジニアリングすると、次の図のようになります。
この例のターゲットHDFSファイルには、movie_director
UDTから抽出される名前と、ratings
リストから求められる平均値が必要になります。
そのために、movierating2
表とmovierating2_ratings
表を結合して、movieごとのratings
の平均を求めるマッピングが必要になります。
このマッピングは次の図のようになります。
図9-5 movierating2
表とmovierating2_ratings
表を結合するマッピング
「図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}