ROW_NUMBER() OVER (PARTITIONBY dept ORDERBY salary DESC) -- 连续不重复排名:1,2,3,4 RANK() OVER (PARTITIONBY dept ORDERBY salary DESC) -- 跳跃排名:1,2,2,4 DENSE_RANK() OVER (PARTITIONBY dept ORDERBY salary DESC) -- 连续排名:1,2,2,3 NTILE(4) OVER (PARTITIONBY dept ORDERBY salary DESC) -- 分成 N 桶
偏移函数
1 2 3 4
LAG(col, n, default) OVER (...) -- 取当前行往前第 n 行的值 LEAD(col, n, default) OVER (...) -- 取当前行往后第 n 行的值 FIRST_VALUE(col) OVER (...) -- 窗口内第一个值 LAST_VALUE(col) OVER (...) -- 窗口内最后一个值
分布函数
1 2
CUME_DIST() OVER (...) -- 累积分布(当前行值 ≤ 该值的行数 / 总行数) PERCENT_RANK() OVER (...) -- 百分比排名(rank-1)/(总行数-1)
9. 自定义函数(UDF)
类型
说明
输入/输出
UDF
普通自定义函数
一行输入 → 一行输出
UDAF
自定义聚合函数
多行输入 → 一行输出
UDTF
自定义表生成函数
一行输入 → 多行输出
UDF 开发步骤(新版 GenericUDF):
1 2 3 4 5 6 7 8 9 10
publicclassMyUDFextendsGenericUDF { @Override public ObjectInspector initialize(ObjectInspector[] arguments) { ... }
@Override public Object evaluate(DeferredObject[] arguments) { ... }
@Override public String getDisplayString(String[] children) { ... } }
注册使用:
1 2 3 4 5 6
-- 临时注册(当前 Session 有效) ADD JAR /path/to/udf.jar; CREATE TEMPORARY FUNCTION my_func AS'com.example.MyUDF';
-- 永久注册 CREATEFUNCTION my_func AS'com.example.MyUDF'USING JAR 'hdfs:///path/to/udf.jar';
10. Hive 调优
4 大 BY
关键字
说明
ORDER BY
全局排序,只有一个 Reducer,慎用
SORT BY
每个 Reducer 内部有序,非全局有序
DISTRIBUTE BY
控制数据分发到哪个 Reducer(类似 Partitioner)
CLUSTER BY
= DISTRIBUTE BY + SORT BY(同一字段),但只能升序
数据倾斜解决方案
GROUP BY 倾斜:
1 2 3 4
-- 开启 Map 端聚合 SET hive.map.aggr=true; -- 开启负载均衡(两阶段聚合) SET hive.groupby.skewindata=true;
COUNT(DISTINCT) 倾斜:
1 2 3 4
-- 改写为 GROUP BY 子查询 SELECTCOUNT(*) FROM ( SELECT user_id FROM t1 GROUPBY user_id ) tmp;
JOIN 倾斜:
1 2 3 4 5 6
-- 小表 JOIN:开启 MapJoin SET hive.auto.convert.join=true; SET hive.mapjoin.smalltable.filesize=25000000; -- 25MB 以下自动转 MapJoin