我正在使用MapReduce来处理我的数据。我需要将输出存储在日期分区下。我的排序键是日期字符串。现在,如果我在自定义分区器类中重写getPartition以返回以下内容:
return (formattedDate.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
因为我们使用hash和Mod,在某些情况下我们返回一个相同的整数值,例如:让我们说numReduceTasks=100
Now the date 2018-01-20 might have hash value as 101. so 101%100 = 1
Now take other date as 2018-02-20 and might have hash value as 201. so 201%100 = 1
因此我们最终将多个日期文件转到单日期分区。这是不希望的。关于如何处理这个的任何指针?
我想在这种情况下你不应该探索使用Partitioners和多个reducer。除非您知道数据集中有多少个唯一日期,否则您将无法设置减速器的数量。
使用MultipleOutputs代替将输出发送到多个文件。 (文件,但不是目录)。如果你需要在不同的目录中发送它们,你可以在MR之后进行驱动程序调用,这将迭代输出目录并根据文件名开始模式将文件移动到目录,在这种情况下将是日期值。
有关使用MO的示例,请参阅this。
另一个选项是运行法线贴图reduce,将输出存储到常规o / p目录,在其上创建一个hive表,并执行动态分区,根据日期列将输出发送到不同的dirs。
多种格式是有效的解决方案。它也适用于创建目录。权威指南帮助了我。
MultipleOutputs的write()方法中指定的基本路径相对于输出目录进行解释,并且因为它可能包含文件路径分隔符(/),所以可以创建任意深度的子目录。例如,以下修改按站和年分区数据,以便每年的数据包含在由站ID命名的目录中(例如029070-99999 / 1901 / part-r-00000)