2012-04-24 11 views
0

私は複数の入力ソースを持っていると私は地図側で複数の独自書き込み可能なフォーマット

public class SQOOP_REC1 extends SqoopRecord implements DBWritable, Writable 

public class SQOOP_REC2 extends SqoopRecord implements DBWritable, Writable 

各入力ソースのカスタムクラスを生成するために、Sqoopのコード生成ツールを使用している、入力ソースに基づいて、私はのオブジェクトを作成しますそれに応じて2クラス以上。

私は2種類の値を持っているのでキーがあります。値の出力タイプは「書き込み可能」です。

削減側では、値の型をWritableとして受け入れます。

public class SkeletonReduce extends Reducer<Text,Writable, Text, Text> { 

public void reduce(Text key, Iterable<Writable> values, Context context) throws  IOException,InterruptedException { 

    } 
} 

私はまた、実行中に

job.setMapOutputValueClass(Writable.class); 

を設定し、それがすべてでreduce関数を入力しません。

誰かがこれを行うことが可能かどうか教えてください。もしそうなら、私は間違って何をしていますか?

答えて

0

出力タイプとしてWritableを指定することはできません。それは具体的なタイプでなければなりません。すべてのレコードは、MapperReducerに同じ(具体的な)キーと値の型を持つ必要があります。異なるタイプが必要な場合は、内部に「A」または「B」のいずれかを含むハイブリッドWritableを作成できます。それは少し醜いですが、動作し、例としてMahoutで多く行われます。

しかし、なぜこれが減速器を作動させないのか分かりません。これはおそらくかなり独立したものであり、この情報に基づいて答えることはできません。

0

値の種類を拡張するGenericWritableを調べてください。許可されているクラスのセット(あなたのケースではSQOOP_REC1とSQOOP_REC2)を定義する必要があります。これは、readFieldsメソッドで新しいオブジェクトインスタンスを作成するため効率的ではありません(しかし、ちょうどインスタンス両方のタイプの変数、および1つが有効である表すフラグ)

0

[OK]を持って、私はこれを行う方法を考え出したと思います。提案に基づいて、私はObjectWritable

ObjectWritable obj = new ObjectWritable(SQOOP_REC2.class,sqoop_rec2); 

を使用してクラスを包み、その後、下げ側に、私はラップクラスの名前を取得し、それをキャストすることができ、自分自身に

http://grokbase.com/t/hadoop/common-user/083gzhd6zd/multiple-output-value-classes

を切断ダグによって与えます元のクラスに戻ります。

if(val.getDeclaredClass().getName().equals("SQOOP_REC2")){ 
       SQOOP_REC2temp = (SQOOP_REC2) val.get(); 

そして忘れてはいけない

 job.setMapOutputValueClass(ObjectWritable.class); 
関連する問題