2014-02-17 36 views
0

我想從映射器發出一個列表。從映射器發出一個列表

List<String> mapFinalList = new ArrayList<String>(); 

有什麼辦法發出列表或我應該爲我的列表創建一個Custom Writable

請推薦。

UPDATE

我嘗試了用ArrayWritable

public static class ListWritable extends ArrayWritable 
{ 
    public ListWritable() { 
    super(Text.class); 
    } 
} 
ListWritable passList = new ListWritable(); 
ArrayWritable[] data = new ArrayWritable[dummy.size()]; 
for (int k = 0; k < dummy.size(); k++) { 
    data[k] = new ArrayWritable(dummy.toArray(new String[dummy.size()])); 
} 
passList.set(data); 
context.write(new Text(""), passList); 

但顯示輸出

[email protected] 

難道我做錯什麼

回答

1

將整個列表保存在內存中並一次性釋放它可能是危險且不可擴展的。除非您強烈要求一次性發出整個string列表,否則我寧願在映射器中實現一個循環,然後單獨發出每個String

3

你可以使用已經實施ArrayWritable爲此目的。或者看看other classes實現Writable接口。

+1

您可以使用'List.toArray(T [])'方法輕鬆地將您的列表轉換爲Array,其中參數將被初始化爲大小爲'mapFinalList.size()'的數組。然後,你可以用這個數組作爲參數創建一個ArrayWritable – vefthym

+0

String [] dummyarray = dummy.toArray(new String [dummy.size()]); context.write(new Text(「」),new ArrayWritable(dummyarray)); 但顯示java.lang.RuntimeException:java.lang.NoSuchMethodException:org.apache.hadoop.io.ArrayWritable。 () –

+0

請看看[this](https://stackoverflow.com/questions/4386781/implementation-of-an-arraywritable-for-a-custom-hadoop-type/4390928#4390928)的答案。 如果此可寫入將作爲Reducer的輸入,則需要創建一個將該值設置爲正確類型的子類。例如:public class StringArrayWritable extends ArrayWritable {public StringArrayWritable(){super(Text.class); }} –