58同城面试盘点

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任务

58同城面试盘点_第1张图片
图片来自: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导入、查询写入吧。


上面的回答有些不是特别周到或者会有错误、更优解,诚心欢迎指摘评论,谢谢!

你可能感兴趣的:(面试经验,面试,数据仓库,hive)