基于spark实现表的join操作

1. 自连接

假设存在如下文件:

[root@bluejoe0 ~]# cat categories.csv 
1,生活用品,0
2,数码用品,1
3,手机,2
4,华为Mate7,3

每一行的格式为:类别ID,类别名称,父类ID

现在欲输出每个类别的父类别的名称,类似于SQL的自连接,注意到join的外键其实是父类ID

首先生成“父类ID->子类ID,子类名称”

val categories=sc.textFile("/root/categories.csv")

val left = categories.map(_.split(",")).map(x=>(x(2)->Map("id"->x(0),"name"->x(1))))

left的内容为:

Array((0,Map(id -> 1, name -> 生活用品)), (1,Map(id -> 2, name -> 数码用品)), (2,Map(id -> 3, name -> 手机)), (3,Map(id -> 4, name -> 华为Mate7)))

接着生成“父类ID->父类ID,父类名称”

val right = categories.map(_.split(",")).map(x=>(x(0)->Map("pid"->x(0),"pname"->x(1))))

right的内容为:

Array((1,Map(pid -> 1, pname -> 生活用品)), (2,Map(pid -> 2, pname -> 数码用品)), (3,Map(pid -> 3, pname -> 手机)), (4,Map(pid -> 4, pname -> 华为Mate7)))

接下来,将这两个RDD进行合并,并按照key(key都是父类ID)进行reduce:

val merged = (left++right).reduceByKey(_++_)

merged的内容为:

Array((4,Map(pid -> 4, pname -> 华为Mate7)), (0,Map(id -> 1, name -> 生活用品)), (1,Map(id -> 2, name -> 数码用品, pid -> 1, pname -> 生活用品)), (2,Map(id -> 3, name -> 手机, pid -> 2, pname -> 数码用品)), (3,Map(id -> 4, name -> 华为Mate7, pid -> 3, pname -> 手机)))

搞定!!

可以采用flatMap来简化以上的写法:

val merged = categories.map(_.split(",")).flatMap((x)=>Array(x(2)->Map("id"->x(0),"name"->x(1)), x(0)->Map("pid"->x(0),"pname"->x(1)))).reduceByKey(_++_)

结果是一样一样的!!当然代码的可读性大打折扣了~~~

2. 两张表连接

转载于:https://www.cnblogs.com/bluejoe/p/5115835.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值