这个问题是关于 Map/Reduce 排序的。我有三个领域
XXID, Identifier, TimeStamp
XXID 可以是任何字符串值,标识符有两个可能的值 1 或 2
我希望排序是这样的,即所有相同的 XXID 都进入同一个减速器,并且在可迭代中,具有 1 的字段首先出现在具有增加时间戳的迭代中,其次是具有 2 的字段。
有人可以帮我吗?
你这样做肯定违反了 mapreduce 框架,但你必须做你必须做的!
首先,排序只在键上进行。因此,您必须假设这些值将按任意顺序排列。因此,我们需要弄清楚如何获取 XXID、Identifier 和 TimeStamp,所有这些都在 key 中。(您现在可能只使用 NullWriteable 作为值)
要将这三个项目放入一个键中,您应该通过实现WriteableComparable来创建一个新的数据类型。让这个新类包装这三个值,我们称之为JavanxTriple
。
您要自定义 MapReduce 类别的项目的方式是从ComparableJavanxTriple
更改.compareTo
函数。使其首先比较 XXID,然后是 1 或 2,然后是时间戳。
接下来,您需要解决的问题是,由于这些东西都是单独的键,默认情况下数据将转到不同的 reducer。开箱即用,您将无法计算所需的数据流。要解决这个问题,您需要编写一个自定义分区程序。分区器告诉每个记录将去哪个reducer。为了做到这一点,你覆盖.getPartition
. 计算.getPartition
时,仅使用 XXID 来确定这个数字(而不是密钥的 Identifier 和 TimeStamp 部分)。他们这样,所有具有相同 XXID 的项目都被发送到同一个减速器。
最后,您现在遇到的问题是您实现 reducer 的方式不典型。reduce 每个键只会被调用一次,传入的 Iterable 中只会有一个 NullWriteable。
为了解决这个问题,在 Reducer 类中使用一些静态变量来跟踪 reduce 函数中发生的事情。您必须检测 XXID 何时更改,以便知道切换下一个分析。您可能必须使用setup 和 cleanup方法来设置和完成。