HiveSQL高级进阶技巧(下)
The following article is from BAT大数据架构 Author 花荣
直接上干货,HiveSQL高级进阶技巧,重要性不言而喻。掌握这10个技巧(下),你的SQL水平将有一个质的提升!
1.-取前20%的方法1
select *
from (
select
row_number() over(order by pv) as rn,
count(1) over() rn_cnt
) t1
where rn / rn_cnt <= 0.2
2.–取前20%的方法2
SELECT user_id,pv,
NTILE(5) OVER(ORDER BY pv DESC) AS rn
FROM tmp
where rn = 1
分位数:
3.percentile:percentile(col, p) col是要计算的列(值必须为int类型),p的取值为0-1,若为0.2,那么就是2分位数,依次类推。
SELECT percentile(number,0.5) from tmp;
4.percentile_approx:percentile_approx(col, p)。列为数值类型都可以。
percentile_approx还有一种形式percentile_approx(col, p,B),参数B控制内存消耗的近似精度,B越大,结果的精度越高。默认值为10000。当col字段中的distinct值的个数小于B时,结果就为准确的百分位数。
-- 取0.2,0.4位置的数据
select percentile(score,<0.2,0.4>) from tmp;
5.lateral view explode相当于笛卡尔乘积:
select id,name
from tmp
lateral view explode(name_array) t as names;
6.Outer关键字可以把不输出的UDTF的空结果,输出成NULL,防止丢失数据。
select id,name
from tmp
lateral view OUTER explode(name_array) t as names;
排序:
7.order by
普通排序,通过order对字段进行降序或者升序
select * from tmp order by id;
8.sort by
对每一个Reduce的结果进行排序,为了看出效果,我们多设置几个Reduce,查看每个Reduce的结果是否是排序的。
set mapreduce.job.reduces=3;
9.distribute by
distribute by设置分区,根据什么来分区,分区就是让什么字段的什么值放在哪一个分区上,设置分区之后再跟进sal进行排序。
10.cluster by
cluster by就是distribute by+sort by的组合,但是只能默认升序。