- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试理解 setOutputValueGroupingComparator 方法对于二次排序的必要性 - setPartitioner 是否足够?
假设我的输入文件有以下字段:customerId、orderId、orderDate、orderAmount
预期输出是每个客户的最后订单
我使用 setOutputKeyComparatorClass() 设置了一个关键比较器,它将按 customerId asc,orderDate desc 进行比较
还有一个使用 setPartitioner() 的分区器,它将按 customerId % numPartition
进行分区这里是如果 reducer 数量为 2 时将发送的示例 key :
key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1
key3: { customerId : 2, orderDate : 2011-12-01 } => reducer 2
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1
我的问题是:
a) 仅使用上述分区器,是否可以按以下(错误的)顺序将键发送到 reducer 1?这里客户 3 与客户 1 交错
key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1
b) 如果是,是否设置一个 setOutputValueGroupingComparator(比较键中的 customerId)来解决这个问题并以正确的顺序将其发送到 reducer?
key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1
谢谢
阿杰
最佳答案
首先,请阅读:http://hadoop.apache.org/common/docs/r0.20.2/mapred_tutorial.html
分区器决定哪些键进入哪些缩减器。因此,如果您有键 A、B、C 和 D,以及缩减器 1 和 2,那么分区器会决定输出 A 和 C(例如)转到缩减器 1,而 B 和 D 转到缩减器 2。
OutputKeyComparatorClass 确定数据在归约之前是否以及如何对具有相同键的不同行进行排序。 Shuffle 阶段仅分组按键输出的 Map - 它不保证数据是排序的。
在您的情况下,您似乎选择了错误的 key 。我认为您的键应该是 { customerId, orderDate } 并且您应该使用 getOutputValueGroupingComparator 来比较按 customerId 的键仅用于分组,并使用 setOutputKeyComparatorClass 来比较按 customerId 和 orderDate 递减的键以输入到 reducer。另请参阅 Owen O'Malley 关于同一主题的电子邮件:http://www.mail-archive.com/core-user@hadoop.apache.org/msg05677.html
关于Hadoop 二次排序(setPartitioner 与 setOutputValueGroupingComparator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204314/
我正在尝试理解 setOutputValueGroupingComparator 方法对于二次排序的必要性 - setPartitioner 是否足够? 假设我的输入文件有以下字段:customerI
我是一名优秀的程序员,十分优秀!