gpt4 book ai didi

hadoop - MapReduce 基于三个字段的排序

转载 作者:可可西里 更新时间:2023-11-01 15:07:12 26 4
gpt4 key购买 nike

这个问题是关于 Map/Reduce 排序的。我有三个字段

XXID, Identifier, TimeStamp

XXID 可以是任意字符串值,标识符有两个可能的值 1 或 2

我希望排序是这样的,即所有相同的 XXID 都进入同一个 reducer,并且在可迭代中,带有 1 的字段首先出现在可迭代中,随着时间戳的增加,带有 2 的字段紧随其后。

谁能帮我解决这个问题?

最佳答案

你这样做肯定违反了 mapreduce 框架,但你必须做你必须做的事!


首先,排序只对键进行。因此,您必须假设这些值将以任意顺序排列。因此,我们需要弄清楚如何获取 key 中的 XXID、标识符和时间戳。 (您现在可以只使用 NullWriteable 作为值)

要将这三个项目放入一个键中,您应该通过实现 WriteableComparable 来创建一个新的数据类型。 .让这个新类包装这三个值,我们称它为 JavaxTriple

自定义 MapReduce 类型的 JavaxTriple 项的方法是更改​​ Comparable 中的 .compareTo 函数。 .让它首先比较 XXID,然后比较 1 或 2,然后是时间戳。


接下来,您需要解决以下问题:由于这些东西中的每一个都是单独的键,因此默认情况下数据将转到不同的 reducer。开箱即用,您将无法计算所需的数据流。要解决此问题,您需要编写自定义 partitioner .分区器告诉每个记录将去往哪个缩减器。为此,您需要覆盖 .getPartition。在计算 .getPartition 时,仅使用 XXID 来确定此数字(而不是 key 的标识符和时间戳部分)。他们的方式是,所有具有相同 XXID 的项目都被发送到同一个 reducer。


最后,您现在遇到的问题是,您实现 reducer 的方式并不典型。每个键只会调用一次 reduce,传入的 Iterable 中只会有一个 NullWriteable。

要解决这个问题,请在 Reducer 类中使用一些静态变量来跟踪 reduce 函数中发生的事情。您必须检测 XXID 何时更改,以便知道切换下一个分析。您可能必须使用 setup and cleanup设置和完成事情的方法。

关于hadoop - MapReduce 基于三个字段的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12535638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com