1.3种排序:row_number和rank,xxxrank的差别
rank()就是排序 相同的排序是一样的,但是下一个小的会跳着排序,比如
等级 排序
23 1
23 1
22 3
dense_rank()相同的排序相同,下一个小的会紧挨着排序,比如
等级 排序
23 1
23 1
22 2
这样总个数是相对减少的,适合求某些指标前几个等级的个数。
row_number()就很简单,顺序排序。比如
等级 排序
23 1
23 2
22 3
这种排序 总个数是不变的,适合求某些值的前几名。
2.order by 和sort by和distribute by的差别
order by
全局排序;
对输入的数据做排序,故此只有一个reducer(多个reducer无法保证全局有序);
只有一个reducer,会导致当输入规模较大时,需要较长的计算时间;
sort by
非全局排序;
在数据进入reducer前完成排序;
当mapred.reduce.tasks>1时,只能保证每个reducer的输出有序,不保证全局有序;
distribute by
按照指定的字段对数据进行划分输出到不同的reduce中;
常和sort by一起使用,并且distribute by必须在sort by前面;
cluster by
相当于distribute by+sort by,只能默认升序,不能使用倒序;
3.行转列和列转行
行转列
select user_id,
concat_ws(',',collect_list(order_id)) as order_value
from col_lie
group by user_id;
使用函数:concat_ws(’,’,collect_set(column))
说明:collect_list 不去重,collect_set 去重。 column的数据类型要求是string
select user_id,order_value,order_id
from lie_col
lateral view explode(split(order_value,',')) num as order_id
limit 10;
4.map join的原理:map广播,可以省略shuffle的阶段