hive中的笛卡尔积

729 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

本文介绍hive中的笛卡尔积的实现原理,包括如何应用、具体例子实践以及注意事项和优化性能等。

先来简单介绍一下笛卡尔积是什么东西呢?

这是由一个名字叫做笛卡尔的人提出来的一种乘积,即两个集合的相乘。

如果两个集合分别是{a,b,c}和{3,4},得到他们的笛卡尔积结果为{(a,3),(a,4),(b,3),(b,4),(c,3),(c,4)}。

Hive本⾝是不⽀持笛卡尔积的,不能⽤select t1 ,t2 from table_1, table_2这种语法,这是无法实现两个集合的相乘的。但在需求开发过程中有时候确实需要⽤到集合的乘积怎么办呢,可以⽤下⾯的语法来实现同样的效果,即表连接的做法:select t1 , t2 from(select * from table1) t1join(select * from table2) t2on 1=1;其中on 1=1是可选的,注意在Hive的Strict模式下不能⽤这种语法,需要先⽤set hive.mapred.mode=nonstrict; 当然hive设为⾮strict模式就可以。

上述就是笛卡尔积的原理,核心思想就是将两个集合或者多个集合的数据相乘,得到一个炸裂的数据集合,其中多个原始集合的数据都会分别组合在一起。

由此应用到实际的数据开发中,有这样一个例子可以使用到笛卡尔积获得结果。

比如要获取一组数据中的缺省数据,A公司的员工每天上班都会乘坐班车,但也不是每个人每天都会坐车,因为员工可能请假没有上班,那要知道哪些天谁没有坐班车呢。

首先通过笛卡尔积的应用原理获得每个人集合和每天集合的一个乘积,然后用这个乘积和每天的班车人员表数据做一个交集,就可以得到缺省的数据啦。思路还是蛮简单的吧。

实际应用中,还要注意是否会增加数据数量,炸裂表数据,对原表中的数据一定要先检测一下,对原集合中的数据纬度有所了解,防止出现笛卡尔积问题,即数据炸裂问题,出现重复的数据。