我正在尝试将我的HDFS文件分成两部分/文件80%和20%用于分类算法(80%用于建模,20%用于预测)请提供相同的建议。
要将 80% 和 20% 转换为 2 个单独的文件,我们需要知道数据集中确切的记录数。只有当我们浏览一次数据集时,才知道。所以我们需要编写 1 个 MapReduce 作业来计算记录数和第 2 个 MapReduce 作业,用于使用多个输入将 80% 和 20% 分成 2 个文件。
我是否在正确的轨道上,或者有任何替代方案。
但又是一个小小的困惑,如何检查减速器是否充满了 80% 的数据。
我建议您使用Random
来拆分数据集,MultipleOutputs
将数据写入单独的路径。只需一个仅地图作业即可完成此操作。下面是您可以使用的映射器示例:
public class Splitter extends Mapper<LongWritable, Text, NullWritable, NullWritable> {
MultipleOutputs mos;
Random rnd = new Random();
@Override
protected void setup(Context context) throws IOException, InterruptedException {
mos = new MultipleOutputs(context);
}
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
if (rnd.nextDouble() < 0.8) {
mos.write(key, value, "learning-set");
} else {
mos.write(key, value, "test-set");
}
}
@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
mos.close();
}
}