hive FULLJOIN中实现部分数据FULLJOIN另一部分数据LEFTJOIN的结果
需求
一个重点店铺表:dim_shop_point
一个用户对店铺关注表:follow_shop
一个近一年用户对店铺订单表:order_shop_year
全量店铺中有重点店铺和其他店铺
实现重点店铺的近一年订单数据及全量关注人群 + 非重点店铺关注人与近一年用户店铺订单的交集。
方案
方案一:
使用订单表order_shop_year ,FULL JOIN上重点店铺的全量关注人群,再LEFT JOIN上非重点店铺的关注人群。
SQL:
select id,shop_id,is_follow,t1.order_info
from order_shop_year t1
full join
(select id,shop,is_followfrom follow_shop a inner join dim_shop_point b on a.shop=b.shop
) t2
on t1.id=t2.id and t1.shop=t2.shop
left join
(select id,shop,is_followfrom follow_shop a left join dim_shop_point b on a.shop=b.shopwhere b.shop is null
) t3
on t1.id=t3.id and t1.shop=t3.shop
此时发现follow_shop表和dim_shop_point 表都被读取了两次,而且job数是5。
有没有job数更少,表读取次数更少的方式呢。
方案二:
给关注店铺用户打上标记,重点店铺标记1,非重点店铺标记0。最后订单表FULLJOIN关注人群,
此时有一下情况:
- 如果左右都匹配,标记设为1(不管是否是重点店铺)
- 如果左表有数,右表为null,表示这个人购买但是没关注,也保留,标记设为1
- 如果左表为null,右表有数,表示此人未购买但关注,此时判断此店铺是否为重点店铺,直接保留提前打上的标识数字即可。
最终结果过滤掉标记0的数据就是结果数据。
SQL:
select id,shop_id,is_follow,t1.order_info
from order_shop_year t1
full join
(select id,shop,is_follow,if(b.shop is null,0,1) as flagfrom follow_shop a left join dim_shop_point b on a.shop=b.shop
) t2
on t1.id=t2.id and t1.shop=t2.shop
where if(t1.id is null,t2.flag,1) = 1
这样所有表都是读取了一次,而且job也减少到3个。
hive FULLJOIN中实现部分数据FULLJOIN另一部分数据LEFTJOIN的结果相关推荐
- 将DataFrame数据如何写入到Hive表中
1.将DataFrame数据如何写入到Hive表中? 2.通过那个API实现创建spark临时表? 3.如何将DataFrame数据写入hive指定数据表的分区中? 从spark1.2 到spark1 ...
- spark抽取mysql数据到hive_使用spark将内存中的数据写入到hive表中
使用spark将内存中的数据写入到hive表中 hive-site.xml hive.metastore.uris thrift://master:9083 Thrift URI for the re ...
- hive 导入hdfs数据_将数据加载或导入运行在基于HDFS的数据湖之上的Hive表中的另一种方法。
hive 导入hdfs数据 Preceding pen down the article, might want to stretch out appreciation to all the well ...
- hive sqoop 分区导入_利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中
测试:利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中. 需要注意的地方: 1,要添加hive.metastore.uris这个参数.否则无法将数据加载到hive表中 ...
- 往hive表中插入与导出数据方式load ,insert ,sqoop 等方式详解
往hive数据仓库的表中导入数据,可以直接insert ,也可以选择load方式.当然也可以通过第三方工具如sqoop等将数据导入到hive当初.特别注意:hive虽然不会验证用户装载的数据和表的模式 ...
- 存在的hive插入数据_往hive表中插入数据以及导出数据
转载:https://blog.csdn.net/qq_26442553/article/details/80380590 转载:https://blog.csdn.net/weixin_436817 ...
- hive表中的数据导出
将hive表中的数据导出到其他任意目录,例如linux本地磁盘,例如hdfs,例如mysql等等 一.insert导出 将查询的结果导出到本地 insert overwrite local direc ...
- hive表中的数据导出:表数据的导出7种方式
将hive表中的数据导出到其他任意目录,例如linux本地磁盘,例如hdfs,例如mysql等等 insert导出 1)将查询的结果导出到本地 :第一种 insert overwrite local ...
- 利用SparkSQL(java版)将离线数据或实时流数据写入hive的用法及坑点
1. 通常利用SparkSQL将离线或实时流数据的SparkRDD数据写入Hive,一般有两种方法.第一种是利用org.apache.spark.sql.types.StructType和org.ap ...
- hive优化之------控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的 ...
最新文章
- IPV6的设置问题!
- shell中大于、等于、小于
- PHP下的Oauth2.0尝试 - 授权码授权(Authorization Code Grant)
- Hive学习之路 (九)Hive的内置函数
- 4.10 风格代价函数-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- 计算机视觉与深度学习 | 机器学习中的数学——入门机器学习
- 【BZOJ - 3450】Tyvj1952 Easy(数学期望,期望的线性性)
- 我对骨骼动画的理解(最精减的骨骼动画类)
- bzoj 1049: [HAOI2006]数字序列(DP+DP)
- layey图片内容不居中
- python数据类型二(列表和元组)
- Oracle的expdp导出、impdp导出命令
- 使用yolo v3训练自己的模型
- 【爬虫】花瓣采集下载器
- 小程序分销商城源码系统+搭建教程+前后端完整版
- 原子结构示意图全部_所有原子结构示意图 号 元素周期表
- 如何提高测试工作效率
- 免费公开课:讲解DevExpress 2016.2新版本功能
- 考研英语(四)——名词性从句
- exit()和return的含义及区别