Join连接条件
Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。Hive 不支持所有非等值的连接,因为非等值连接非常难转化到 map/reduce 任务。
- LEFT,RIGHT和FULL OUTER关键字用于处理join中空记录的情况
- LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现
- 限制:JOIN 子句中右边的表只能在 ON 子句中设置过滤条件
join 时,每次 map/reduce 任务的逻辑是这样的:reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统
With AS中间临时表
格式
- with temp_tablename as (select ),as (select )….
- 可读性强
- 执行时间快,每次只需要创建一次表结果
开窗函数
- 格式
- xxx() over(partition by fileName order by fileName desc/asc) as num
- 如果 over 不提供分组方法,那就计算后的值会显示在每一列的值
- xxx() over(partition by fileName order by fileName desc/asc) as num
- rank()
- 函数对于排序后相等的值,排序序号是一样的且下一个不相等值之后序号是间隔的例如:1,2,2,4
- 与group by的区别
- 执行顺序
- gb 先进行计算
- 窗口函数在group by之后计算
- 排序范围不同
- 普通的order by整体排序
- 窗口函数order by只决定开窗内的排序顺序
- 展示的数据形式
- group by只保留于分组字段聚合的结果
- 开窗可以保留表中的全部数据
- 执行顺序
其他开窗函数
UDF(User-Defined-Function),一进一出,即最基本的自定义函数,类似to_char,to_date等
- UDAF(User- Defined Aggregation Funcation),多进一出,聚合函数,类似在 group by 之后使用的 sum,avg 等
- UDTF(User-Defined Table-Generating Functions),一进多出,生成函数,有点像stream 里面的 flatMap
分组聚合函数,Collect 列转行
- collect_list 重复 和 collect_set 去重
- 格式定义
- — 将 colname 指定的列值聚合为一个数组
- array collect_list(
);
- 语法
- SELECT a, collect_list(b) as list FROM tb group by a;
- 可结合Distinct使用
- SELECT collect_list(DISTINCT name) FROM students;
- array 元素有序可用sort_array
- select sort_array(collect_set(col)) AS col;
- 优点
- 突破行数限制,先聚合在分解
ntile 分组切片函数
概念:
Hive SQL 的 ntile 函数用于将分组数据按照顺序切分成n组,并返回当前切片值。如果切片不均匀,默认增加第一个切片的分布。它把有序的数据集合「平均分配」到指定的数量(n)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差 1。
语法格式:
bigint ntile(bigint <n>) over (partition by <col1>[, <col2>…]
[order by <col1>[asc|desc][, <col2>[asc|desc]…]] [<windowing_clause>]))
参数:
- n:必填,代表切片的数量,为 BIGINT 类型;
- partition by [, …]:至少指定 1 个开窗口的列;
- order by col1[asc|desc][, col2[asc|desc]…]:可选,指定返回结果的排序方式。
返回:
- 返回 BIGINT 类型
它需要家配合窗口函数一起使用,将窗口分组数据按照顺序切片,并返回切片值。