hive:子查询

hive本身支持的子查询非常有限,Hive不支持where子句中的子查询,只允许子查询在from中出现

错误写法:

insert into table branch_atmzc_sum
Select  XT_OP_TRL, SA_TX_DT,"取款-存款",b.cr_tx_amt- a.cr_tx_amt as cr_tx_amt from branch_atmzc a join  branch_atmzc b  on (a.XT_OP_TRL = b.XT_OP_TRL and a.SA_TX_DT = b.SA_TX_DT and a.tran_cd = ‘ATM存款‘ and b.tran_cd = ‘ATM取款‘), counts from branch_atmzc
group by XT_OP_TRL, SA_TX_DT,cr_tx_amt,counts;

正确写法:

insert into table branch_atmzc_sum
Select a.XT_OP_TRL, a.SA_TX_DT,"取款-存款",b.cr_tx_amt- a.cr_tx_amt ,b.counts+a.counts  from branch_atmzc a join  branch_atmzc b  on (a.XT_OP_TRL = b.XT_OP_TRL and a.SA_TX_DT = b.SA_TX_DT and a.tran_cd = ‘ATM存款‘ and b.tran_cd = ‘ATM取款‘)

另外一种:考虑效率

SELECT
	t1.产品类型,
	COUNT(DISTINCT (IF(t2.用户ID IS NULL, NULL, t1.用户ID))) AS KEEP_UV
FROM
(
	SELECT
		产品类型,
		用户ID
	FROM 事实表
	WHERE (`DATE` >= 20140201 AND `DATE` <= 20140228)
) t1
LEFT OUTER JOIN
(
	SELECT
		产品类型,
		用户ID
	FROM 事实表
	WHERE (`DATE` >= 20140101 AND `DATE` <= 20140131)
) t2 ON (t1.产品类型 = t2.产品类型 AND t1.用户ID = t2.用户ID)
GROUP BY t1.产品类型

 本身表包含的字段信息多,时间跨度大。对于这种对于IN / EXISTS子查询(准确地说,这里是非相关子查询)有一种高效的实现,就是LEFT SEMI JOIN:

LEFT SEMI JOIN implements the uncorrelated IN/EXISTS subquery semantics in an efficient way.

left join

SELECT
	产品类型,
	COUNT(DISTINCT t1.用户ID) AS KEEP_UV
FROM
(
	SELECT
		产品类型,
		用户ID
	FROM 事实表
	WHERE (`DATE` >= 20140201 AND `DATE` <= 20140228)
) t1
LEFT SEMI JOIN
(
	SELECT
		产品类型,
		用户ID
	FROM 事实表
	WHERE (`DATE` >= 20140101 AND `DATE` <= 20140131)
) t2 ON (t1.产品类型 = t2.产品类型 AND t1.用户ID = t2.用户ID)
GROUP BY 产品类型

  

时间: 2024-10-11 14:46:02

hive:子查询的相关文章

hive 子查询特别分析

转自: http://blog.csdn.net/ls3648098/article/details/9630357 Hive只支持在FROM子句中使用子查询,子查询必须有名字,并且列必须唯一:SELECT ... FROM(subquery) name ... 确认下是否一定要求列必须唯一? 建表语句: create table  tb_in_base ( id  bigint, devid bigint, devname string ) partitioned by (job_time b

Hive学习之Union和子查询

Union的语法格式如下: select_statement UNION ALL select_statement UNION ALL select_statement ... Union用于将多个SELECT语句的查询结果合并到一个结果集中,目前Hive只支持UNION ALL,也就是结果集中的重复记录不会被删除.SELECT语句返回列的数目和名称必须相同,否则会报schema错误.Union语句还可以嵌套在FROM子句中: SELECT * FROM ( select_statement U

hive用left semi join替代in子查询的方式

执行如下hive sql: select * from trackinfo where ds=$date and session_id in (select session_id from rcmd_track_path where ds=$date and add_cart_flag>0 and product_id>0);</span> 提示报错如下: FAILED: ParseException line 2:39 cannot recognize input near 's

HIVE:用外连接替代子查询

由于hive也支持sql,很多人会把hql跟标准sql进行比较,甚至有的时候会直接套用.hive不支持事务也不支持索引,更不支持追加写,但是对于一般的sql都是能够支持的.但是对于一些子查询确实无法支持的,例如 ? 1 select * from t_ext_1_bkdoubledelete where f1=(select max(f1) from t_ext_1_bkdoubledelete) 这个sql在mysql中是能够支持的,意思是找到val最大的那一行记录,然后在hive中运行确实报

【hive】子查询

hive中是不支持子查询的 但是并不意味这不支持in 或者 not in in 或者not in 后边是定值的话是支持的 但是接定制是可以的 例如 select id from table not in(1,2,3) 但是这种是不支持的 select id from table1 not in ( select id from table2 where col1 = 'a' ) 我们需要用left join来实现 (1)把table1和table2符合条件的数据进行连接 select t1.id

关于Hive中case when不准使用子查询的解决方法

在公司用Hive实现个规则的时候,遇到了要查询某个字段是否在另一张表中,大概情况就是 A表: id value1 value2 1 100 0 2 101 1 3 102 1 B表: value1 100 102 104 我要查询A表中当value2为0的时候直接输出0,为1的时候,判断value1是否在B表的value1中,如果在那么便输出0,不在便输出1,拿到第一反映是: select case when value2 = 0 then 0 when value2 = 1 then case

hive笔记-----查询数据

一.排序和聚集 hive中的order by能够预期产生完全排序的结果,但这个排序的过程只是使用一个reduce任务来完成的,这个面对大规模的数据集肯定不可行的 因此 sort by出现,它可以为每个reduce任务产生一个排序文件 distribute by 可以控制某个特定行应该到哪个reducer,目的在于进行后续的聚集操作 例如 from record2 select year,temperture distribute by year sort by year asc,temperat

hive 高级查询1

hadoop hive 高级查询 select基础 1.0 一般查询 1)select * from table_name 2)select * from table_name where name='....' limit 1; 1.1cte和嵌套查询 1)with t as(select....) select * from t; 2)select * from(select....) a;(a一定要添加) 1.2列匹配正则表达式 在添加数据前:SET hive.support.quoted

hive 高级查询

hadoop hive 高级查询 Hive聚合运算 - Group by (基本内置聚合函数)nmax, min, count, sum, avg 1)Hive基本内置聚合函数与group by 一起使用 2)支持按位置编号分组 set hive.groupby.orderby.position.alias=true; select name,sum(score) from table_name group by name;——>使用表达式 Hive聚合运算-hiving 1)对group by