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 bigint) row format delimited fields terminated by ‘,‘;

create table  tb_in_up

(

id  bigint,

devid bigint,

devname string

) partitioned by (job_time bigint) row format delimited fields terminated by ‘,‘;

场景一:单表子查询没有指定表别名

语句:select * from (select id,devid,job_time from tb_in_base) ;

执行过程:

提示需要指定子查询源。

加上表别名:

语句:select * from (select id,devid,job_time from tb_in_base) a;

执行过程:

加了表别名后可以正常输出子查询中的数据。

结果分析:在hive中若有子查询必须指定子查询的表别名

场景二:单表查询外围字段比子查询少一个

语句: select id,devid from (select id,devid,job_time from tb_in_base) a;

执行过程:

结果分析:输出外围指定字段的数据可以输出 。

场景三:两张表进行union all

语句:

select a.id,a.devid from (select a.id,a.devid,a.job_time from tb_in_base a union all select b.id,b.devid,b.job_time from tb_in_up b) a;

执行过程:

结果分析:两张表进行union all 取相同的字段名称,可正常输出指定数据内容,且结果为两张表的结果集

场景四:两张表在子查询中进行union

语句:

select a.id,a.devid from (select a.id,a.devid,a.job_time from tb_in_base a union  select b.id,b.devid,b.job_time from tb_in_up b) a;

执行过程:

结果分析:hive 不支持union

网上相关内容:http://www.cnblogs.com/ggjucheng/archive/2013/01/15/2861574.html

hive 子查询特别分析

时间: 2024-10-10 22:36:02

hive 子查询特别分析的相关文章

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

表连接查询与where后使用子查询的性能分析。

子查询就是在一条查询语句中还有其它的查询语句,主查询得到的结果依赖于子查询的结果. 子查询的子语句可以在一条sql语句的FROM,JOIN,和WHERE后面,本文主要针对在WHERE后面使用子查询与表连接查询的性能做出一点分析. 对于表连接查询和子查询性能的讨论众说纷纭,普遍认为的是表连接查询的性能要高于子查询.本文将从实验的角度,对这两种查询的性能做出验证,并就实验结果分析两种查询手段的执行流程对性能的影响. 首先准备两张表 1,访问日志表mm_log有150829条记录(相关sql文件已放在

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:子查询

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】子查询

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

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两