SQL表关联-一对多的表关联

文章讲述了作者在SparkSQL环境下处理MySQL风格的表关联问题,遇到B表id为A表b_id字符串的情况。通过find_in_set函数和explode/lateralview方法解决了问题,强调了在大数据处理中考虑数据结构的重要性。同时,作者感慨现代程序员面临的技能要求日益多元化和复杂化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL表关联-一对多的表关联

取这个标题有点犹豫,感觉描述的不准确,直接看表数据就好理解:
A表:
| id | b_id |
| 1 | 1,2,3 |
| 2 | 2,4,5 |

B表:
|id | name |
| 1 l isi |
| 2 | san |
| 3 | wang|

这表格有点不会弄,哈哈,现在要做的就是A表关联B表,通过A.b_id和B.id来关联,正常情况下通过一个字段来关联直接“=”就可以,但是这里B表的id字段存在A表中是一个字符串,就是我这次遇到的需求,在网上找搜了一个find_in_set(str,str数组)这个函数,那篇博客里说的是在mysql里可以通过这个函数实现表关联,大概是这样的sql
select * from A
join B
on find_in_set(B.id,A.b_id);
在mysql的环境里我没试,因为我这次是基于sparkSql,类似于oracle那种标准的sql语言,这个函数返回的是一个Int类型的数字,我用了这个来做表关联之后报错是“on”后面需要一个Boolean类型,但是返回的是一个Int类型,所以sql执行不了,后来又尝试了基于这个函数在“on”后面用case语句来返回一个Boolean,或者“in”函数,都不行,但是具体是因为什么我没有确定,因为工作需要抓紧时间啊,后来没办法就打算先查出来一个临时表,再做关联。就是将A表中的一行数据,转换成多行数据

A表转换前:
| id | b_id |
| 1 | 1,2,3 |
| 2 | 2,4,5 |

A表转换后:
| id | b_id |
| 1 | 1|
| 1 | 2|
| 1 | 3 |
| 2 | 2 |
| 2 | 4 |
| 2 | 5|
当然这里A表中的id是主键的话是不可以重复的,这里是展示主要问题的展示,这个问题乍一看感觉是个很简单的sql,但是我想了好久也没想出什么简单有效的sql来,还得问度娘,这里推荐一个我看到的写的比较好的一篇博客:
https://blog.youkuaiyun.com/zijikanwa/article/details/121771935

这个人写的思路比较清晰,我是采用了他基于hive的那种解决方案使用explode函数和lateral view解决了问题。这里就想起了之前用mysql做业务的时候好像还没有遇到这种情况,一般来说,关联其它表的字段,是不会存到一起去的,但是目前在做hadoop,hbase这种处理大数据的库,可能是数据量太大,所以存成了一条。这里可以得到一个建表的经验,不要把一张表中关联其他表的字段存到一起,不然还要处理一下,有点麻烦。

最后说点自己最近的感想,互联网啊,程序员可能在很多人心中是一个挣钱多,好找工作这么一个概念,但是最近几年真不是这样,以前你作为一个做java的业务开发我会SSM,懂Mysql,有点工作经验,找工作应该不会很难找,但是现在给我的感觉这些都是基础了,就像excel这样,你作为一个程序员这些是必须要会的了,你得懂各种中间件,redis,mq,这些就不说了,肯定会用到,zk,dubbo,spring相关的框架你得了解吧,会用吧。现在除了这些,大数据时代来了,有些业务要处理大数据量,mysql肯定不行啊,有些业务就要用到大数据用到的一些技术,hadoop,hbase,hive,flink这些和大数据沾边的东西也要求你了解,会用。至于说语言,怎么说呢,项目不会管你会不会,不会去想你是作为java招进来的,linux要懂点,部署啊,一般的运维你要懂点,脚本语言你得会吧,什么python,per,scalal这些你要了解一些,起码知道基本的语法要看懂把。所以我觉得程序员现在真不怎么好干,不过又说回来,你不偷不抢,不坑蒙拐骗,现在哪一行又好干呢。环境不会适应你,自己就只能去适应现在的工作环境。强者,不是在一个规则,一个环境里打败你,你来制定规则,你来挑选你的环境,我依然是那个胜利者,这才是一个强者吧。

“是不是一定要有所失,才能有所悟”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值