2
比方說,我有一個數十億行的文件,大小爲500G到1T。我怎樣才能用相同的線條產生一個新的文件,但隨機洗牌?如果可以實現,洗牌應該是完全隨機的。在mapreduce中洗牌大數據文件
比方說,我有一個數十億行的文件,大小爲500G到1T。我怎樣才能用相同的線條產生一個新的文件,但隨機洗牌?如果可以實現,洗牌應該是完全隨機的。在mapreduce中洗牌大數據文件
創建一個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一樣給予無偏見的洗牌,但這種解決方案更容易實施且速度相當快。
聰明。我會隨機抽取一篇關於這篇文章的鏈接。它可以用來做一個洗牌:http://had00b.blogspot.com/2013/07/random-subset-in-mapreduce.html – ahoffer
美麗!這從來沒有進入我的腦海! – Rainfield
一個問題:減速器的數量是否對隨機性有影響? – Rainfield