【发布时间】:2014-07-22 04:08:46
【问题描述】:
假设我有一个数十亿行的文件,大小为 500G 到 1T。如何生成具有相同行的新文件,但随机打乱行?如果可以的话,洗牌应该是完全随机的。
【问题讨论】:
假设我有一个数十亿行的文件,大小为 500G 到 1T。如何生成具有相同行的新文件,但随机打乱行?如果可以的话,洗牌应该是完全随机的。
【问题讨论】:
创建一个映射器,将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 那样提供公正的洗牌,但这种解决方案更易于实施且速度相当快。
【讨论】: