Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在mapreduce中洗牌大数据文件_Java_Algorithm_Mapreduce - Fatal编程技术网

Java 在mapreduce中洗牌大数据文件

Java 在mapreduce中洗牌大数据文件,java,algorithm,mapreduce,Java,Algorithm,Mapreduce,假设我有一个包含数十亿行的文件,大小是500G到1T。如何生成一个具有相同行的新文件,但随机洗牌这些行?如果可以实现,洗牌应该是完全随机的。创建一个映射器,将GUID映射到您的行。以下Hadoop映射器说明了逻辑: public class ShuffleMapper extends Mapper<LongWritable, Text, Text, Text> { @Override protected void map(LongWritable key, Text valu

假设我有一个包含数十亿行的文件,大小是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);
  }
}
公共类ShuffleMapper扩展映射器{
@凌驾
受保护的void映射(LongWritable键、文本值、上下文)引发IOException、InterruptedException{
write(新文本(UUID.randomuid().toString()),值);
}
}
在减速器中,您只需收集行(值)。这可以使用一个减速机完成,或者如果您面临资源问题(例如,本地磁盘已满),您可以拆分多个减速机,然后从命令行中删除
concat


注意:这不一定像Fisher Yates那样提供无偏见的洗牌,但是这个解决方案更容易实现,而且速度相当快。

聪明。我想给这篇关于随机抽样的文章添加一个链接。它可以用来洗牌:一个问题:减数器的数量对随机性有影响吗?@JackLei不应该,至少在我的脑海中没有影响。对随机性的唯一影响应该是UUID算法,所以只要看看它有多“随机”(它很可能与时间有关,因此在同一时间运行的映射程序可能会导致相同的序列-尽管这也相对不太可能发生)。