hive like在join中的应用二(进阶)
问题:
现在有每个用户每场比赛上场的卡牌组合,现在需要求出一张卡牌出场的次数、两张卡牌出场的次数、三张卡牌出场的次数…八张卡牌出场的次数
如下为一个用户3场比赛的出场卡牌组合:
神圣领域|摇头菇|淤泥|独轮车骑手|发条撕裂者|石棒士兵|丛林勇士|布鲁兄弟
复活术|冰川风暴|神佑护盾|基地无敌|摇头菇|骑手哈雷|豪猪射手|冰霜族长:贾德维克
落雷术|摇头菇|布鲁兄弟|椰果抛射器16型|骑手哈雷|琥珀酋长|豌豆射手|冰霜族长:贾德维克
例如一张卡牌出场的次数:神圣领域出场1次,摇头菇出场3次,骑手哈雷出场2次等等
例如两张卡牌出场的次数:摇头菇+布鲁兄弟出场2次,骑手哈雷+冰霜族长:贾德维克出场次数为2次等等(摇头菇、布鲁兄弟和布鲁兄弟、摇头菇算一次,不管他们在卡牌组合哪一个位置,怎样的顺序)
分析:
两张卡牌次数怎么算?首先想到的是上一章我们提到的模糊匹配关联。先把所有的两两组合列出来,再根据两两组合进行模糊匹配。
第一步:
根据’|'切割出所有卡牌:
select card
from dw_center.dw_pc_sqzb_battle_card_detail as a
lateral view explode(split(card_array,'\\|')) a as card
where dt='20210803'
group by card;
第二步:
拿到单张卡牌数据进行自关联,关联的时候排除自己跟自己关联的情况,自己跟小于自己的数据进行关联,得到所有的两两组合的卡牌数据。
为什么自己跟小于自己的数据进行关联?
例如1、2、3跟1、2、3进行关联。1和1关联、1和2关联、1和3关联,2和1关联、2和2关联、2和3关联。这个时候,1和2,2和1是一样的结果,所以进行t1_1.rank<=t2_1.rank
这一步剔除去重数据,又保证了卡牌的顺序
create table test.test_card_history stored as orc as
select t1_1.card as card_1,t2_1.card as card_2
from
(select card,row_number() over(order by card) as rank
from test.test_card) t1_1cross join
(selectcard,row_number() over(order by card) as rank
from test.test_card) t2_1
where t1_1.card<>t2_1.card and t1_1.rank<=t2_1.rank;
第三步:
对每个用户的卡牌组合进行聚合,得到组合的卡牌出场次数,一个组合里面,每张卡牌出场次数为1
spark-sql> select > card_array,> join_pv> from test.test_pc_sqzb_battle_card_array_cnt> limit 3;
复活术|冰川风暴|神佑护盾|基地无敌|摇头菇|骑手哈雷|豪猪射手|冰霜族长:贾德维克 1
独轮车骑手|发条撕裂者|骸骨战士:莫格莱尼|鼓手乐普|龙虾女士|丛林勇士|丛林树屋|摇头菇 1
摇头菇|龙王:钢索|毁灭者47|篝火漫步者|冲撞者|独轮车骑手|发条撕裂者|冰霜族长:贾德维克 1
Time taken: 0.21 seconds, Fetched 3 row(s)
第四步:
上面的卡牌组合数据跟我们得到两两卡牌组合进行笛卡尔积,对每一个卡牌组合进行模糊匹配。如果里面有两张卡牌进行我们两两卡牌组合一样,就符合我们的要求。最后两两卡牌组合拼接起来,得到的就是我们两两组合的出场次数。
spark-sql> select > concat(t4.card_1,'|',t4.card_2) as card,> sum(join_pv) as join_pv> from > (select> card_array,> join_pv> from test.test_pc_sqzb_battle_card_array_cnt) t3> > cross join > (select > card_1,> card_2> from test.test_card_history) t4 > where t3.card_array like concat('%',t4.card_1,'%') and t3.card_array like concat('%',t4.card_2,'%')> group by concat(t4.card_1,'|',t4.card_2) > limit 10;
冰川风暴|玉米塔 223
冰川风暴|大块头阿布 37
河豚|神佑护盾 26
复活术|椰果抛射器16型 30
复活术|猛犸象:曼尼 298
流沙术|豪猪射手 167
箭雨|骸骨战士:莫格莱尼 110
大块头阿布|雷霆天罚 11
琥珀酋长|长矛手小队 520
神佑护盾|箭雨 115
Time taken: 39.225 seconds, Fetched 10 row(s)
注:以上方法试用于查询需求,实际生产中,如果数据量太大,根据此方法可能跑起来比较吃力。
hive like在join中的应用二(进阶)相关推荐
- Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积
1 left semi join的时间比in的时间短,比in高效 2 left semi join时select中不能出现右表的字段,不然报错 3 left semi join 时on中出现左表字 ...
- Hive的连接(join)方案
一 Common JOIN/Reduce Side JOIN/Shuffle JOIN 这三种其实都是一种连接方案:即在Reduce端做JOIN操作.一般情况下,如果不手动指定MapJoin或者不满足 ...
- Hive map side join入门及测试
什么是MapJoin? MapJoin顾名思义,就是在Map阶段进行表之间的连接.而不需要进入到Reduce阶段才进行连接.这样就节省了在Shuffle阶段时要进行的大量数据传输.从而起到了优化作业的 ...
- Hive优化之Join(三)
1.Join算法概述 Hive拥有多种join算法,包括Common Join,Map Join,Bucket Map Join,Sort Merge Buckt Map Join等,下面对每种j ...
- java双斜线转义_转义字符\(在hive+shell以及java中注意事项):正则表达式的转义字符为双斜线,split函数解析也是正则...
转义字符将后边字符转义,使特殊功能字符作为普通字符处理,或者普通字符转化为特殊功能字符. 各个语言中都用应用,如java.python.sql.hive.shell等等. 如sql中 "\& ...
- hive之Map Join使用方法
目录 介绍 mapjoin的使用方法 结语 介绍 MAPJION会把小表全部加载到内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map端是进行了join操作,省去了reduce ...
- hive 删除某个分区中部分数据
目录 一.需求 二.思路 三.补充 一.需求 删除 hive 表中某个分区中的部分数据(不是删除该分区) 二.思路 1.数据库删除数据的本质其实是用新的数据去覆盖原有的表,只要新的数据中不含有你想删除 ...
- sql语句中left join和inner join中的on与where的区别分析
原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...
- Oracle的left join中on和where的区别
Oracle的left join中on和where的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和wher ...
最新文章
- ensp删除静态路由命令_(温州大学)路由与交换机 期末试卷及解析
- 如何从KDE中切換到openSUSE的GNOME桌面环境
- AlphaFold2被超越!中国团队刷新全球蛋白质结构预测纪录,大牛彭健创业项目一鸣惊人...
- Template Method (C++实现)
- Git恢复之前版本的两种方法reset、revert详解
- DHTML【2】--HTML
- Dynamics CRM 提示“操作无效”
- Java中的6颗语法糖
- 关于Spring Cloud微服务框架的一些概念
- 我是个老爸--当局者迷,旁观者清
- 大数据之-Hadoop3.x_MapReduce_序列化案例Debug调试---大数据之hadoop3.x工作笔记0101
- 25.卷1(套接字联网API)--- 信号驱动式IO
- 谈谈制作台历的心得——年初企业们比较喜欢的宣传方式
- 为了物尽其用报废的涉密计算机的硬盘,检测不到硬盘不能轻易将其定为报废
- java打包成jar对其进行加密处理防止反编译
- Matlab是常见的高级语,高级语言具有哪些特点 试述低级语言与高级语言的特点...
- 2021-01-19 灵动ICPC集训
- 微服务设计简单实践---从一个简单需求学习微服务思想
- 移动APP测试用例设计实践经验分享
- SQL和Oracle数据库备份