问题:
现在有每个用户每场比赛上场的卡牌组合,现在需要求出一张卡牌出场的次数、两张卡牌出场的次数、三张卡牌出场的次数…八张卡牌出场的次数
如下为一个用户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中的应用二(进阶)相关推荐

  1. Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积

    1 left semi join的时间比in的时间短,比in高效 2 left semi join时select中不能出现右表的字段,不然报错 3  left semi  join 时on中出现左表字 ...

  2. Hive的连接(join)方案

    一 Common JOIN/Reduce Side JOIN/Shuffle JOIN 这三种其实都是一种连接方案:即在Reduce端做JOIN操作.一般情况下,如果不手动指定MapJoin或者不满足 ...

  3. Hive map side join入门及测试

    什么是MapJoin? MapJoin顾名思义,就是在Map阶段进行表之间的连接.而不需要进入到Reduce阶段才进行连接.这样就节省了在Shuffle阶段时要进行的大量数据传输.从而起到了优化作业的 ...

  4. Hive优化之Join(三)

    1.Join算法概述   Hive拥有多种join算法,包括Common Join,Map Join,Bucket Map Join,Sort Merge Buckt Map Join等,下面对每种j ...

  5. java双斜线转义_转义字符\(在hive+shell以及java中注意事项):正则表达式的转义字符为双斜线,split函数解析也是正则...

    转义字符将后边字符转义,使特殊功能字符作为普通字符处理,或者普通字符转化为特殊功能字符. 各个语言中都用应用,如java.python.sql.hive.shell等等. 如sql中 "\& ...

  6. hive之Map Join使用方法

    目录 介绍 mapjoin的使用方法 结语 介绍 MAPJION会把小表全部加载到内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map端是进行了join操作,省去了reduce ...

  7. hive 删除某个分区中部分数据

    目录 一.需求 二.思路 三.补充 一.需求 删除 hive 表中某个分区中的部分数据(不是删除该分区) 二.思路 1.数据库删除数据的本质其实是用新的数据去覆盖原有的表,只要新的数据中不含有你想删除 ...

  8. sql语句中left join和inner join中的on与where的区别分析

    原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...

  9. Oracle的left join中on和where的区别

    Oracle的left join中on和where的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和wher ...

最新文章

  1. ensp删除静态路由命令_(温州大学)路由与交换机 期末试卷及解析
  2. 如何从KDE中切換到openSUSE的GNOME桌面环境
  3. AlphaFold2被超越!中国团队刷新全球蛋白质结构预测纪录,大牛彭健创业项目一鸣惊人...
  4. Template Method (C++实现)
  5. Git恢复之前版本的两种方法reset、revert详解
  6. DHTML【2】--HTML
  7. Dynamics CRM 提示“操作无效”
  8. Java中的6颗语法糖
  9. 关于Spring Cloud微服务框架的一些概念
  10. 我是个老爸--当局者迷,旁观者清
  11. 大数据之-Hadoop3.x_MapReduce_序列化案例Debug调试---大数据之hadoop3.x工作笔记0101
  12. 25.卷1(套接字联网API)--- 信号驱动式IO
  13. 谈谈制作台历的心得——年初企业们比较喜欢的宣传方式
  14. 为了物尽其用报废的涉密计算机的硬盘,检测不到硬盘不能轻易将其定为报废
  15. java打包成jar对其进行加密处理防止反编译
  16. Matlab是常见的高级语,高级语言具有哪些特点 试述低级语言与高级语言的特点...
  17. 2021-01-19 灵动ICPC集训
  18. 微服务设计简单实践---从一个简单需求学习微服务思想
  19. 移动APP测试用例设计实践经验分享
  20. SQL和Oracle数据库备份

热门文章

  1. Error querying database
  2. 手把手教你做安豆计算器(三)-计算器功能实现
  3. python 数据、曲线平滑处理——基于Numpy.convolve实现滑动平均滤波——详解
  4. java项目-第86期基于ssh的上门家教在线预约系统
  5. 操作系统概念笔记2.操作系统结构
  6. matlab创建一个函数,Matlab创建文件、function文件和函数调用
  7. 提前祝大家中秋节快乐!
  8. 一文带你了解python是什么?能做什么?为什么要学?
  9. 删除 Word文档中的空白页方法
  10. 苹果目前使用的Javascript框架