0

AvroParquetInputFormat を使用します。このユースケースでは、複数の入力ディレクトリをスキャンする必要があり、各ディレクトリには 1 つのスキーマを持つファイルがあります。AvroParquetInputFormat クラスは複数の入力スキーマを処理できないため、各クラスが AvroParquetInputFormat から継承する MyAvroParquetInputFormat1、MyAvroParquetInputFormat2 などの複数のダミー クラスを静的に作成することで回避策を作成しました。そして、ディレクトリごとに異なる MyAvroParquetInputFormat を設定し、それが機能しました (これを達成するためのよりクリーンな方法があれば教えてください)。

私の現在の問題は次のとおりです。

各ファイルには数百の列があり、メタデータに基づいて各ディレクトリの ProjectionSchema を構築し、不要なディスクとネットワーク IO を削減します。各 MyAvroParquetInputFormat クラスで静的な setRequestedProjection() メソッドを使用します。ただし、静的であるため、最後の呼び出しの ProjectionSchema はすべてのディレクトリからデータを読み取るために使用されますが、これは必要な動作ではありません。

回避策/解決策へのポインタは高く評価されます。

ありがとうございます。それでは、お元気で

MK

4

1 に答える 1

2

avro スキーマに互換性がある場合 (スキーマの互換性の定義については avro doc を参照)、単一のスキーマですべてのデータにアクセスできることに注意してください。これを拡張して、すべてのスキーマと互換性のある寄木細工に適したスキーマ (共用体なし) を構築することもできるため、そのスキーマだけを使用できます。

あなたが取ったアプローチに関しては、私が知っている簡単な方法はありません。入力形式ごとに異なるスキーマを割り当てるには、MultipleInputs 機能を何らかの方法で拡張する必要があります。MultipleInputs は、ジョブ構成で 2 つの構成プロパティを設定することによって機能します。

mapreduce.input.multipleinputs.dir.formats //contains a comma separated list of InputFormat classes
mapreduce.input.multipleinputs.dir.mappers //contains a comma separated list of Mapper classes.

これら 2 つのリストは同じ長さでなければなりません。そして、ここが難しいところです。この情報は Hadoop コードの奥深くで使用され、マッパーと入力形式を初期化するため、独自のコードを追加する必要があります。

別の方法として、Hive など、既に利用可能なツールのいずれかを使用してプロジェクションを行うことをお勧めします。スキーマがそれほど多くない場合は、一連の単純なハイブ クエリを記述して各スキーマのプロジェクションを実行できます。その後、単一のマッパーを使用してデータを処理したり、必要に応じて何でも処理したりできます。

于 2015-01-09T11:45:29.590 に答える