查询语句
自动升级数据类型
在做join或计算处理时候,低级的type会自动升级成高级的,如int-bigint,int-float
表生成函数
explode 把行变成列
stack 把多列变成多行
case……when……
case when 是对单列的查询结果
case 需要写结束end
case 会在select过程中直接生成新的列,需要用的时候需要给出列名
select name, salary,
case
when salary<5000 then 'low'
when salary>5000 and salary<7000 then 'middle'
when salary>7000 and salary<10000 then 'high'
else 'very high'
end as bracket from employees
join
join时候,hive默认最后一张表最大,所以会把前面的几张表缓存起来,去和最后一张join 因此,一般把大的表往后放。但大部分情况下,大表放在前面更符合逻辑要求。因此,可以用代码控制缓存的表格。 如将s设为最后的驱动表格。
select /*+STREAMTABLE(s)*/s.ymd,
s.symbol,
s.price_close,
d.dividend,
FROM stocks a JOIN dividend d
on s.ymd=d.ymd and s.symbol =d.symbol
where s.symbol='APPL'
join where 处理顺序关系
where 在连接操作之后才会处理,但在where中加入分区过滤可以加快查询速度
(select where) 会按照要求在数据进行连接操作前进行分区过滤
join连接
- inner join= join
on和where给条件是等价的 - left outer join
on只能给join条件,表的筛选条件要用where给出 - right outer join
- full outer join
- in….EXSISTS(其他SQL语句) = left semi-join 只保留左表那些满足右表join条件的行记录
- 笛卡尔乘积:如果不给出join的on条件,就会实现join的全连接的笛卡尔乘积,生成表之后在进行where的筛选。eg.
select * from stocks join dividends
where stock.symbol=dividends.symbol
and stock.symbol='AAPL'
排序
- order by
全排序,时间长
ASC 升序,DESC 降序 - sort by
在每个reducer内进行排序,如果有多个reducer,即不是全排序
UNION ALL
连接的表必须列名,列的顺序,列的字符type都相同
demo
create table tmp.amy_coffee_menu as
select
activityid,
transaction_rank,
daypart_name,
max(case when category_desc='Drink' and subcategory_desc='Coffee' then 'Coffee' end) as drink_coffee_yn,
from tmp.amy_coffee_receiver4
where combo_flag<>1
and alc_price>0
group by activityid,
transaction_rank,
daypart_name;
create table tmp.yidan_1218_drink_member as
select a.*
,b.user_type
,b.sex
,b.birthday
from tmp.amy_phdi_member2 a
join tmp.amy_phdi_drinkuser3 b
on a.usercode=b.usercode and a.subcategory_desc='Drink';