面经-数仓-百度

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的阶段

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值