2012-04-24 38 views
0

我有多個輸入源,我已經使用Sqoop的代碼生成工具來生成自定義類每個輸入源多個自定義可寫格式

public class SQOOP_REC1 extends SqoopRecord implements DBWritable, Writable 

public class SQOOP_REC2 extends SqoopRecord implements DBWritable, Writable 

在地圖方面,根據輸入信號源的,我創建的對象相應地超過2級。

我有鑰匙類型「文本」,並且自我有2種不同類型的值,我不停的值輸出類型爲「可寫」。

在減少側,我接受值類型作爲可寫。

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); 

在執行過程中,它不進入的減少功能的。

有人能告訴我,如果這樣做可以嗎?如果是這樣,我做錯了什麼?

回答

0

不能指定Writable作爲輸出類型;它必須是一個具體的類型。所有記錄需要具有相同(具體)的鍵和值類型,分別爲Mappers和Reducers。如果您需要不同的類型,您可以創建某種混合內部的「A」或「B」的混合Writable。例如,它有點醜陋,但在Mahout中工作並做了很多工作。

但我不知道爲什麼所有的這將使減速機無法運行;根據這些信息,這可能是相當獨立的,而不是可回答的。

0

好吧,我想我找到了如何做到這一點。根據建議,由Doug給砍自己

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

我使用ObjectWritable

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

,然後在減少側包裹類,我可以被包裝類的名字將其丟回到原來的班級。

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

而且不要忘記

 job.setMapOutputValueClass(ObjectWritable.class);