【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 as id1,t2.id as id2 from table1 t1 left join(

  select id from table2 where col1 = ‘a’

) t2 on t1.id = t2.id

这时符合条件的table1条目连接的table2条目为null

(2)然后根据in 或者 not in来筛选数据

where

in: id2 is not null

not in: id2 is null

或者使用left semi-join来实现(不支持right semi-join)

left-semi join 返回左边表满足 on 条件的记录

select id from table1 t1 left semi join table2 t2

on t1.id = t2.id and t2.col1 != ‘a’

left-semin join 要比join更高效,因为对于左表中一条制定的记录在右边表一旦匹配到就停止右边表的匹配

原文地址:https://www.cnblogs.com/zzhangyuhang/p/9792683.html

时间: 2024-11-15 00:08:20

【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本身支持的子查询非常有限,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_

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中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