2014-07-21 65 views
2

比方說,我有一個數十億行的文件,大小爲500G到1T。我怎樣才能用相同的線條產生一個新的文件,但隨機洗牌?如果可以實現,洗牌應該是完全隨機的。在mapreduce中洗牌大數據文件

回答

3

創建一個GUID你行對應一個映射。以下Hadoop映射器說明了邏輯:

public class ShuffleMapper extends Mapper<LongWritable, Text, Text, Text> { 
    @Override 
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
    context.write(new Text(UUID.randomUUID().toString()), value); 
    } 
} 

在reducer中,您只需收集行(值)。這可以使用單個reducer來完成,或者如果您遇到資源問題(例如,本地磁盤已滿),可以拆分多個reducer,然後從命令行中刪除concat行。

注意:這並不一定會像Fisher-Yates一樣給予無偏見的洗牌,但這種解決方案更容易實施且速度相當快。

+1

聰明。我會隨機抽取一篇關於這篇文章的鏈接。它可以用來做一個洗牌:http://had00b.blogspot.com/2013/07/random-subset-in-mapreduce.html – ahoffer

+0

美麗!這從來沒有進入我的腦海! – Rainfield

+0

一個問題:減速器的數量是否對隨機性有影響? – Rainfield