hive语法

查询语句

自动升级数据类型

在做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';

你可能感兴趣的:(hive语法)