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导入、查询写入吧。

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

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: