一,order by ,sort by,distribute by 的用法

1)order by 对全局数据的一个排序,仅仅只有一个reduce工作,最好不用。

2)sort by  对每一个reduce 内部数据进行排序,全局结果集来说不是排序。

set mapreduce.job.reuces = 3 ;


 会生成3个文件,每个文件内都是排好序的。

3)distribute by  分区partition 类似与MapReduce 中分区parition ,对数据进行分区,默认采用hash算法,结合sort by 进行使用
注意:distribyte by 必须要放在 sort by 前面。

4)cluster by 当distribute by 和 sort by  字段相同时候,可以使用cluster by 来代替。

5)group by 分组,按照相同的key分为一组,也是按key来分区。

6)partition by 分区,窗口函数中的子句。

distribute by与group by对比
都是按key值划分数据
都使用reduce操作
唯一不同的是distribute by只是单纯的分散数据,而group by把相同key的数据聚集到一起,后续必须是聚合操作。

order by与sort by 对比
order by是全局排序
sort by只是确保每个reduce上面输出的数据有序。如果只有一个reduce时,和order by作用一样。

应用场景
map输出的文件大小不均
reduce输出文件大小不均
小文件过多
文件超大

把一个大文件放到一些小文件中
set mapred.reduce.tasks=5;-->大文件变成5个文件,相同的province到一个文件中

insert overwrite table city
selsct time,country,province,city from info
distribute by province;

把一些小文件放到一个大文件中
set mapred.reduce.tasks=1;-->合并小文件
 

insert overwrite table province partition(dt='xxxx')
selsct time,country,province from city
distribute by country;

二、窗口函数和分析函数

应用场景:
(1)用于分区排序
(2)动态Group By
(3)Top N
(4)累计计算
(5)层次查询

窗口函数

FIRST_VALUE:取分组内排序后,截止到当前行,第一个值
LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值
LEAD(col,n,DEFAULT) :用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)
LAG(col,n,DEFAULT) :与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

OVER从句

1、使用标准的聚合函数COUNT、SUM、MIN、MAX、AVG
2、使用PARTITION BY语句,使用一个或者多个原始数据类型的列
3、使用PARTITION BY与ORDER BY语句,使用一个或者多个数据类型的分区或者排序列
4、使用窗口规范,窗口规范支持以下格式:

(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
 (ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
 (ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING

注意:rows是物理的行,而range是逻辑上的行,比如取关键字id的数据的下面2行,就用rows关键字,而限制id 的范围在 (id-2, id+2) 之间就用range.

当ORDER BY后面缺少窗口从句条件,窗口规范默认是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

当ORDER BY和窗口从句都缺失, 窗口规范默认是 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

OVER从句支持以下函数, 但是并不支持和窗口一起使用它们。
Ranking函数: Rank, NTile, DenseRank, CumeDist, PercentRank.
Lead 和 Lag 函数.

分析函数

ROW_NUMBER() 从1开始,按照顺序,生成分组内记录的序列,比如,按照pv降序排列,生成分组内每天的pv名次,ROW_NUMBER()的应用场景非常多,再比如,获取分组内排序第一的记录;获取一个session中的第一条refer等。
RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位
DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位
CUME_DIST 小于等于当前值的行数/分组内总行数。比如,统计小于等于当前薪水的人数,所占总人数的比例
PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
NTILE(n) 用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)。
具体的更多用需要参考hive的官方文档

https://cwiki.apache.org/confluence/display/Hive/LanguageManual

三、一次查询多次插入

可以执行一次查询过程,而插入到多张表中去,效率很高

from table_name
 
insert overwrite  table table_name1 partition(day='xxx')
 
select xxx  where coulmn < 200
  
insert overwrite table table_name2 partition(day='xxx')
 
select xxx  where lenght(coulmn) =0;

四、条件语句

Return Type

Name(Signature)

Description

T
    

 

if(boolean testCondition, T valueTrue, T valueFalseOrNull)

    

Returns valueTrue when testCondition is true, returns valueFalseOrNull otherwise.

如果testCondition 为true就返回valueTrue,否则返回valueFalseOrNull ,(valueTrue,valueFalseOrNull为泛型)

T

nvl(T value, T default_value)

Returns default value if value is null else returns value (as of HIve 0.11).

如果value值为NULL就返回default_value,否则返回value

T

COALESCE(T v1, T v2, ...)

Returns the first v that is not NULL, or NULL if all v's are NULL.

返回第一非null的值,如果全部都为NULL就返回NULL  如:COALESCE (NULL,44,55)=44

T

CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END

When a = b, returns c; when a = d, returns e; else returns f.

如果a=b就返回c,a=d就返回e,否则返回f  如CASE 4 WHEN 5  THEN 5 WHEN 4 THEN 4 ELSE 3 END 将返回4

T

CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END

When a = true, returns b; when c = true, returns d; else returns e.

如果a=ture就返回b,c= ture就返回d,否则返回e  如:CASE WHEN  5>0  THEN 5 WHEN 4>0 THEN 4 ELSE 0 END 将返回5;CASE WHEN  5<0  THEN 5 WHEN 4<0 THEN 4 ELSE 0 END 将返回0
 

boolean

isnull( a )

Returns true if a is NULL and false otherwise.

如果a为null就返回true,否则返回false

boolean

isnotnull ( a )

Returns true if a is not NULL and false otherwise.

如果a为非null就返回true,否则返回false

五、join用法

查找一张表在另为一张表没有的数据,适用于增量数据与历史数据合并,并且去除重复的数据。

select a.* from a left join b on (a.tid = b.tid) where b.tid is null;

查找a表中没有b表的数据。b.tid  is  null 就是 join 后过滤掉b 表中包含的数据。

六、with as 用法

with q1 as (select from src where key'5'),

q2 as (select from src s2 where key '4')

select from q1 union all select from q2;

with as 可以把数据缓存在内存中,避免多次计算重复的数据,with as就类似于一个视图或临时表,可以用来存储一部分的sql语句作为别名,不同的是with as 属于一次性的,而且必须要和其他sql一起使用才可以

七,动态插入

set hive.exec.dynamici.partition=true; #开启动态分区,默认是fals
set hive.exec.dynamic.partition.mode=nonstrict; #开启允许所有分区都是动态的,否则必须要有静态分区才能使用。