10道经典Hive题目
我有早起的习惯,每天早晨上班前的这段时间脑子非常清醒,这段时间我会用来充实自己。看到某个公众号发了一篇Hive的面试题的推文,顺手拿过来做了下。共计10道题,花了下班后的晚上和一个早晨的时间写完。
第一题
需求:
1 | 我们有如下的用户访问数据 |
实现:
数据准备:
1 | CREATE TABLE prac.test1 ( |
查询SQL:
1 | with t1 as( |
第二题
需求:
1 | 有50W个京东店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志, |
数据准备:
1 | CREATE TABLE prac.test2 ( |
查询SQL:
(1)每个店铺的UV(访客数)
1 | select |
(2)每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数
1 | with t1 as( |
第三题
需求
1 | 已知一个表STG.ORDER,有如下字段:Date,Order_id,User_id,amount。 |
数据准备:
1 | CREATE TABLE prac.test3 ( |
查询SQL:
(1)给出 2017年每个月的订单数、用户数、总成交金额。
1 | select |
(2)给出2017年11月的新客数(指在11月才有第一笔订单)
1 | with t1 as( |
不得不说答案上的这个写法真的很巧妙:
1 | SELECT count(user_id) |
第四题
需求:
1 | 有一个5000万的用户文件(user_id,name,age),一个2亿记录的用户看电影的记录文件(user_id,url),根据年龄段观看电影的次数进行排序? |
数据准备:
1 | CREATE TABLE prac.test4user |
查询SQL:
1 | with t1 as( |
第五题
1 | 有日志如下,请写出代码求得所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有访问记录的用户) |
数据准备:
1 | CREATE TABLE prac.test5( |
查询SQL:
求得所有用户和活跃用户的总数及平均年龄。(活跃用户指连续两天都有访问记录的用户)
1 | with t1 as( |
这道题比较复杂,难度在于如何求活跃用户,首先对用户活跃日志进行去重,每个用户每天只保留一条,然后对其按照用户分组,按照日期升序,使用row_number对其打上序号rk。
不难看出,如果是连续登录,那么日期dt和序号会是一个等差数列,故用登陆日期dt和序号做差,得到新的日期起别名flag。然后按照user_id和flag进行分组,如果一个分组内的数据量大于等于2,就说明这位用户是活跃用户。得到活跃用户,再一次进行去重操作,因为同一用户可能多次活跃,被判定为多次活跃用户。得到活跃用户再求他们的数量和平均年龄就比较简单了。
第六题
需求:
1 | 请用sql写出所有用户中在今年10月份第一次购买商品的金额, |
数据准备:
1 | CREATE TABLE prac.test6 ( |
查询SQL:
1 | with t1 as( |
第七题
需求:
1 | 现有图书管理数据库的三个数据模型如下: |
(1)数据准备:
1 | CREATE TABLE prac.book(book_id string, |
(2)找出姓李的读者姓名(NAME)和所在单位(COMPANY)
1 | select |
(3)查找“高等教育出版社”的所有图书名称(BOOK_NAME)及单价(PRICE),结果按单价降序排序。
1 | select |
(4)查找价格介于10元和20元之间的图书种类(SORT)出版单位(OUTPUT)和单价(PRICE),结果按出版单位(OUTPUT)和单价(PRICE)升序排序。
1 | select |
(5)查找所有借了书的读者的姓名(NAME)及所在单位(COMPANY)。
1 | select |
(6)求科学出版社图书的最高单价、最低单价、平均单价。
1 | select |
(7)找出当前至少借阅了2本图书(大于等于2本)的读者姓名及其所在单位
1 | with t1 as( |
(8)考虑到数据安全的需要,需定时将“借阅记录”中数据进行备份,请使用一条SQL语句,
在备份用户bak下创建与“借阅记录”表结构完全一致的数据表BORROW_LOG_BAK.井且将“借阅记录”中现有数据全部复制到BORROW_L0G_ BAK中。
1 | CREATE TABLE prac.borrow_log_bak AS |
(9)现在需要将原Oracle数据库中数据迁移至Hive仓库,请写出“图书”在Hive中的建表语句(Hive实现,提示:列分隔符|;数据表数据需要外部导入:分区分别以month_part、day_part 命名)
1 | drop table if exists book2; |
(10)Hive中有表A,现在需要将表A的月分区 201505 中 user_id为20000的user_dinner字段更新为bonc8920,其他用户user_dinner字段数据不变,请列出更新的方法步骤。
- 1.新建临时表写入更改过的数据
- 2.把临时表数据写回原分区
第八题
需求:
1 | 有一个线上服务器访问日志格式如下(用sql答题) |
数据准备:
1 | CREATE TABLE prac.test8(`date` string, |
查询SQL
1 | with t1 as( |
第九题
需求:
1 | 有一个充值日志表credit_log,字段如下: |
数据准备:
1 | CREATE TABLE prac.test9( |
查询SQL:
1 | with t1 as( |
第十题:
需求:
1 | 有一个账号表如下,请写出SQL语句,查询各自区组的money排名前十的账号(分组取前10) |
数据准备:
1 | INSERT INTO TABLE prac.test10 VALUES |
查询SQL:
1 | -- 查询各自区组的money排名前十的账号(分组取前10) |
这10道题并不难,和工作中的HiveSQL相比真的不算什么了,日拱一卒。加油!