为 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 中的键生成多个输出记录的主要内容,如果未能解决你的问题,请参考以下文章