hadoop大数据处理之表与表的连接
前言: hadoop中表连接其实类似于我们用sqlserver对数据进行跨表查询时运用的inner join一样,两个连接的数据要有关系连接起来,中间必须有一个相等的字段进行连接,其实hadoop的表连接就是对文本的处理,处理的文本中有一部分的内容是一样的,然后把这鞋大量的数据按照中间的一个相同的部分进行连接,用来解决大数据在关系型数据库查询困难的问题。
之前一直做c#语言的开发是一个本本分分做网站开发的程序员,像对hadoop这类用java语言做开发的内容一直属于菜鸟级别,hadoop中表连接也只最近慢慢学的,也是因为要解决工作中的一些问题慢慢熟悉起来的,在工作中确实解决了不少问题,下面我就讲一下我在工作中那个地方用到了表连接,其实还有很多地方,这里举一个比较经典的。
我们公司是做论坛的,数据了谈不上太大,不过也还够我这种小角色忙活半天了,之前出现了一个需求,就是拿到每一个帖子的发帖用户,和该帖子下所有的回帖用户,然后基于这个数据统计和发帖用户最相关的回帖用户,其实就是找用户与用户之间的关系。
这里的数据有两份(1)发帖人的信息,postid(帖子的id)和userid(发帖人id)(2)回帖人信息,postid(帖子的id)和userid(回帖人id)。这两个数据在数据库中是分别放在两个表中的,看似简单的问题如果一旦跟大数据扯上了关系就不好处理了,这里的发题人信息由3百万的数据,而回帖人的信息有7千多万条数据,中间如果用sqlserver的inner join根本是没办法查询的,这个时候就可以用hadoop的表连接了,首先把数据用工具从数据库到出成文本,因为要对两部分数据进行标示,所以两份数据要在文本中用"\t"分割的之后的length必须不同,
这一份是主帖的数据第一列是postid,第二列是用户的id,第三列是随便取出来的数据作为主帖的表示

这一份是回帖的数据,第一列是postid,第二列是回帖的用户id

在map阶段用postid作为key进行,中间给主帖一个标示typeL,并且给回帖的数据进行一个标示typeR。

1 private static final Text typeL = new Text("A:"); 2 private static final Text typeR = new Text("B:"); 3 public static class GetMap extends Mapper<Object, Text, Text, MapWritable> { 4 public void map(Object key,Text value,Context context) throws IOException,InterruptedException { 5 if (value==null) { 6 return; 7 } 8 9 String [] detail=value.toString().split("\t"); 10 if (detail.length==2) { 11 12 //回帖信息 13 Text threadid=new Text(detail[0]); 14 MapWritable mapWritable=new MapWritable(); 15 mapWritable.put(typeR, new Text(detail[1])); 16 context.write(threadid, mapWritable); 17 } 18 else 19 { 20 //主帖信息 21 Text threadid=new Text(detail[0]); 22 MapWritable mapWritable=new MapWritable(); 23 mapWritable.put(typeL, new Text(detail[1])); 24 context.write(threadid, mapWritable); 25 } 26 27 } 28 29 }
在reduce就可以把相关联的帖子的发帖人id和回帖人id关联起来了

1 public static class GetReduce extends Reducer<Text, MapWritable, Text, Text>{ 2 public void reduce(Text key,Iterable<MapWritable> values,Context context) throws IOException,InterruptedException{ 3 Iterator<MapWritable> iterator=values.iterator(); 4 ArrayList<Text> threadList=new ArrayList<Text>(); 5 ArrayList<Text> postlist=new ArrayList<Text>(); 6 while (iterator.hasNext()) { 7 MapWritable mapWritable=iterator.next(); 8 if (mapWritable.containsKey(typeL)) { 9 threadList.add((Text) mapWritable.get(typeL)); 10 }else if (mapWritable.containsKey(typeR)) { 11 postlist.add((Text)mapWritable.get(typeR)); 12 13 } 14 } 15 if (threadList.size()==1&&postlist.size()>0) { 16 String string=""; 17 for (Text text : postlist) { 18 string=string+text.toString()+"\t"; 19 } 20 context.write(threadList.get(0), new Text(string)); 21 } 22 23 } 24 }
最终的结果展示

每一行中,第一个就是发帖人id,后边跟着的就是回帖人的信息。
博客园内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」