58同城面试盘点
1.一张订单表,有user_name,order_id,order_time,order_amount 四个字段,怎么取出每个用户2021年10月以来第一个订单的金额(下单时间格式为’yyyy-MM-dd HH:mm:ss’)?
select user_name,
order_id,
order_amount
from(
select user_name,
order_id,
order_amount,
row_number() over(partition by user_id order by order_time) rowno
from orders t11 where sub_string(order_time,7) >= '2021-10'
) t1
where t1.rowno = 1
2. 开窗函数有可能会造成什么问题?
数据倾斜,处理方法见:
https://blog.csdn.net/weixin_44902108/article/details/122973111?spm=1001.2014.3001.5501
3.hive sql是怎么转换成mr的?
(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。也就是MR/Spark。
附:详细版
1.Antlr(解析器的一种)定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
2.编译器遍历AST Tree,抽象出查询的基本组成单元QueryBlock(查询块),再遍历查询块,生成操作树OperatorTree
3.逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
4.执行器遍历OperatorTree,翻译为MapReduce任务树
5.物理层优化器进行MapReduce任务的变换,生成最终的MR任务
图片来自:https://www.cnblogs.com/w-j-q/p/14863331.html
4.hive执行计划主要看哪些内容?
这个真的很少看,不知道下面的对不对:
stage数量及依赖情况;
数据行数和所占空间数;
表扫描方式、使用分区列表;
join方式、运行模式,排序等。
5.数据量过大如何去重?
1.分桶–union all --并行(大数据操作中,分而治之思想很有惊喜,可惜当时没想起来)
2.UDF_MD5去重大法。
编写UDTF函数,取该表所在HDFS路径,对每行数据进行MD5加密,去重,并输出表。
没有实践,不知道行不行。
3.其他方法还没想起来。
6.mysql索引的存储方式
详见:https://blog.csdn.net/weixin_44902108/article/details/109826193?spm=1001.2014.3001.5501
7.hive的数据导入方式有哪些?
我没有get到点,我说全量/增量?不是
sqoop?阿里的dataX或华为的Xdata?不是
哈哈哈,回来百度了下才知道,可能是说本地加载、hdfs导入、查询写入吧。
上面的回答有些不是特别周到或者会有错误、更优解,诚心欢迎指摘评论,谢谢!