使用嵌套子查询优化hive多连接查询

在工作中,常用到left join来关联其他hive表进行查询,并且每个表都有相应的where条件。

在数据量大的情况下,不同连接条件所在的位置对查询效率的影响还是很大的。下面举一些例子:

现在有三个表,它们分别是:

表一:user_info

字段名   类型     备注 
imei   bigint  
type   string     
date   string   分区列
表二:age_info

字段名	类型	备注
id	   bigint  	
age	   int  	
day	   string	分区列
表三:sex_info

字段名	类型	备注
id	   bigint  	
sex	   int  	
day	   string	分区列

以下sql代码:

select 
t1.imei,
t1.type,
t2.age,
t3.sex
from user_info t1
left join age_info t2 on t1.imei = t2.id
left join sex_info t3 on t1.imei = t3.id
where t1.date = '2019-02-20'
and t2.day = '2019-02-20'
and t3.day = '2019-02-20'

优化sql,将where条件放到子查询中,查询效率将会提高很多。

select 
t1.imei,
t1.type,
t2.age,
t3.sex
from 
(select imei,type from user_info where date='2019-02-20') t1 
left join (select age from age_info where day='2019-02-20') t2 on t1.imei = t2.id
left join (select sex from sex_info where day='2019-02-20') t3 on t1.imei = t3.id

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive中,可以使用嵌套子查询来处理字段。嵌套子查询是将一个查询语句嵌套在另一个查询语句中的技术。根据提供的引用内容,以下是一个示例Hive查询,其中包含了字段嵌套子查询: SET sdate=2019-07-15; --上周一 SET edate=2019-07-21; -- 上周日 SET company=anlle; SET recomrecords=ods.ods_${hiveconf:company}_KPI_RecomRecords; SET employees=ods.ods_${hiveconf:company}_base_employees; SET branchs=ods.ods_${hiveconf:company}_base_branchs; SET regions=ods.ods_${hiveconf:company}_base_regions; SELECT CASE WHEN d.Name IS NOT NULL THEN d.Name ELSE '' END AS regionName, CASE WHEN c.Name IS NOT NULL THEN c.Name ELSE '' END AS branchName, CASE WHEN A.WorkNo IS NOT NULL THEN A.WorkNo ELSE '' END AS workNo, CASE WHEN A.Fullname IS NOT NULL THEN A.Fullname ELSE '' END AS employeeName, CASE WHEN A.EntryDate IS NOT NULL THEN A.EntryDate ELSE '' END AS entryDate FROM ${hiveconf:employees} A LEFT JOIN ${hiveconf:branchs} c ON A.BranchNo=c.Number LEFT JOIN ${hiveconf:regions} d ON concat(concat('%{',A.BranchNo),'}%') WHERE RankSery LIKE 'C%' AND IsLeave IS NULL AND branchno NOT LIKE '%lni' AND branchno NOT LIKE '%yunying' AND NOT EXISTS ( SELECT 1 FROM ${hiveconf:recomrecords} B WHERE A.Number=B.EmployeeNo AND PhaseId=10 AND FillinDate<='2019-07-20 00:00:00' AND FillinDate<='2019-07-21 23:59:59' AND IsApprove=1 AND IsCancel IS NULL ) 在这个查询中,嵌套子查询被用作左连接的条件和WHERE子句的一部分。嵌套子查询的结果将用于过滤和匹配主查询中的数据。通过使用嵌套子查询,可以根据特定的条件来选择和处理字段的值。 #### 引用[.reference_title] - *1* [使用嵌套子查询优化hive连接查询](https://blog.csdn.net/m0_37773338/article/details/87746538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [hive:语法:怎样写exist/in以及not exists/not in子句 和 字段嵌套子查询](https://blog.csdn.net/weixin_38750084/article/details/97773323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值