为 mapreduce 中的键生成多个输出记录

Posted

技术标签:

【中文标题】为 mapreduce 中的键生成多个输出记录【英文标题】:Generating multiple output records for a key in mapreduce 【发布时间】:2015-03-09 19:44:46 【问题描述】:

我必须对大型数据集执行 sql 'group by' 类型的(不完全是)操作。 我能想到的一个简单的类似示例如下所示,其中所需的输出可能是 1)对(国家,城市,性别,母语)的数据进行分组 2)对(国家,城市,性别,年龄组)的数据进行分组 3)对(国家,城市,年龄组)的数据进行分组

country   city        gender      age_group    mother_tongue     no_of_times_surveyed
----------------------------------------------------------------

USA       new_york     female       middle       english        5
USA       seattle      male         middle       english        2
USA       new_york     female       middle       english        3
USA       new_york     male         middle       french         3
UK        london       male         senior       german         3  
UK        london       male         junior       german         3 
UK        london       male         senior       german         3 

使用通用 map-reduce 作业,我可以指定将用于分组的字段,但在这种情况下,我必须运行此作业 3 次。 所有 3 个案例都有重复计算。(按国家、城市分组很常见)

如果我想输出按(国家、城市)分组的记录,那么(国家、城市)将是 mapreduce 作业的关键,输出应该是这样的

USA       new_york     female       middle       english        8
USA       seattle      male         middle       english        2
USA       new_york     male         middle       french         3
UK        london       male         senior       german         6
UK        london       male         junior       german         3 

此输出可进一步按性别/年龄组/母语进行分组。在此 mapreduce 输出中,reducer 键 (USA,new_york) 和 (UK,london) 有多个记录

可以在reduce方法中多次调用context.write()吗?虽然要做到这一点,我需要将其他字段的组合存储在内存中,这可用于进一步分组(上例中的性别、年龄组和母语)。

是否可以使用多个输出和我不知道的东西? 或者有没有办法在mapreduce中实现这一点?

【问题讨论】:

【参考方案1】:

简短的回答是肯定的。 MapReduce 最好命名为 FlatMapReduce(在函数式编程术语中)。每次调用 context.write() 都会生成一条新记录。

话虽如此,对于此类高度结构化的数据(甚至是半结构化的,有时甚至是非结构化的数据),您最好的选择是使用 Hive 之类的东西。 Hive 团队已经实现了所有的关系代数运算符。此外,他们还已经实现了数十种 SQL 计划优化(就像您描述的那样)。

【讨论】:

以上是关于为 mapreduce 中的键生成多个输出记录的主要内容,如果未能解决你的问题,请参考以下文章

为 ID 列生成的键在表记录中返回 null

MapReduce的输出格式

[Hadoop]MapReducer工作过程

我们真的需要在 MapReduce 框架中进行排序吗?

MapReduce输入输出类型格式及实例

MapReduce计算框架