惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
Recent Announcements
Recent Announcements
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
A
About on SuperTechFans
Vercel News
Vercel News
博客园 - 【当耐特】
爱范儿
爱范儿
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
D
Docker
博客园 - 叶小钗
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Help Net Security
I
InfoQ
博客园 - 三生石上(FineUI控件)
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - ~大器晚成~

我的2012 一个非重点校计算机专业毕业生的求职之路 Vim设置 推荐系统的循序进阶读物(从入门到精通) Hadoop 常见错误汇总 (转载) 信息检索技术——向量空间模型 信息检索技术——布尔检索 排序算法——堆排序 查找算法——找到序列中第二大的数(修正版) 排序算法——快速排序 排序算法——冒泡排序 排序算法——选择排序 牛×的可视化排序 shell常用技巧 排序算法——插入排序 机器学习相关——文本分类综述 大公司 or 小公司 使用gdb进行调试高级篇 使用gdb进行调试中级篇
Hadoop 实现多个数据表的join操作
~大器晚成~ · 2012-03-01 · via 博客园 - ~大器晚成~

今天在使用hadoop时遇到一个需求,要将具有一定关系的若干个大表进行合并join,乍看起来比较困难。但是仔细分析了一下,还是可以比较好的解决问题的。况且在海量数据处理中,这是一个非常普遍常见的需求。因此写下来和大家分享一下。如果哪为仁兄看后有更好的办法,咱们也可以切磋一下。欢迎拍砖,哈哈。

下面描述一下需求,有如下两种数据

数据A

key value1 value2 value3...valuen

数据B

value1 a1 a2 a3....an

value2 b1 b2 b3....bn

...

valuen x1 x2 x3...xn

目标数据

key value1 a1 a2 a3...an value2 b1 b2 b3...bn....valuen x1 x2 x3...xn

也就是要把所有的数据集合并在一行。当然,所有的数据都是海量的,上TB的数据,显然无法单机进行合并。于是本人想了个办法,在hadoop集群上使用两轮mapreduce完成,下面附上方法,欢迎拍砖。

第一轮的map

使用valuen做为key,红色为key, 整行数据作为value,即

value1 1 key value1 value2 value3...valuen

value2 1 key value1 value2 value3...valuen

...

valuen 1 key value1 value2 value3...valuen

value1 2 a1 a2 a3....an

value2 2 b1 b2 b3....bn

...

valuen 2 x1 x2 x3...xn

第一轮reduce

经过map阶段,标准输入数据应该是下面的格式。(为什么就不用我说了吧,如果大家不明白,建议先看一下mapreduce的机制,可以参见之前的文章)

value1 1 key value1 value2 value3...valuen

value1 2 a1 a2 a3....an

value2 1 key value1 value2 value3...valuen

value2 2 b1 b2 b3....bn

...

valuen 1 key value1 value2 value3...valuen

valuen 2 x1 x2 x3...xn

进行合并

得到下面的结果

key value1 value2 value3...valuen value1 a1 a2 a3....an

key value1 value2 value3...valuen value2 b1 b2 b3....bn

...

第二轮map

继续以key value1 value2 value3...valuen整行为key,打印输出

key value1 value2 value3...valuen value1 a1 a2 a3....an

key value1 value2 value3...valuen value2 b1 b2 b3....bn

...

第二轮reduce

将上面的结果直接进行合并之后,整理输出格式,就可以得到预期的数据了。

想了很久,本人没有找到更好的方法可以少于2轮map-reduce完成上出过程。特此发表此文,希望高人能够给出建议,谢谢