hive改造MapReduce(临时篇)

hive改造MapReduce(临时篇)

【问题4】[编程题]请用Hive实现“2023春-作业3”中MR编程题的需求,并给出你的解题思路和过程简述

某市连锁书店共有4个门店,每个门店的每一笔图书销售记录都会自动汇总到该市分公司的销售系统后台,销售记录数据如下(约100万数量级): BTW-08001 2011 年 1 月 2 日 2011年1月2日 201112鼎盛书店$BK-83021$12 BTW-08002 2011 年 1 月 4 日 2011年1月4日 201114博达书店$BK-83033$5 BTW-08003 2011 年 1 月 4 日 2011年1月4日 201114博达书店$BK-83034 41...... 其中记录样例说明如下: / / [ 流水单号 ] 41 ...... 其中记录样例说明如下: //[流水单号] 41......其中记录样例说明如下://[流水单号][交易时间] [ 书店名称 ] [书店名称] [书店名称][图书编号]$[售出数量] BTW-08001 2011 年 1 月 2 日 2011年1月2日 201112鼎盛书店$BK-83021$12 年底,公司市场部需要统计年度各门店图书热销Top3,并做成4张报表上报公司经理,根据书店分区;请在MR框架下编程实现这个需求,数据表名为xsjl_1.txt,对应数据如下:BTW-08001 2011 年 1 月 2 日 2011年1月2日 201112鼎盛书店$BK-83021$12 BTW-08002 2011 年 1 月 4 日 2011年1月4日 201114博达书店$BK-83033$5 BTW-08003 2011 年 1 月 4 日 2011年1月4日 201114博达书店$BK-83034$41 BTW-08004 2011 年 1 月 5 日 2011年1月5日 201115博达书店$BK-83027$21 BTW-08005 2011 年 1 月 6 日 2011年1月6日 201116鼎盛书店$BK-83028$32 BTW-08006 2011 年 1 月 9 日 2011年1月9日 201119鼎盛书店$BK-83029$3 BTW-08007 2011 年 1 月 9 日 2011年1月9日 201119博达书店$BK-83030$1 BTW-08008 2011 年 1 月 10 日 2011年1月10日 2011110鼎盛书店$BK-83031$3 BTW-08009 2011 年 1 月 10 日 2011年1月10日 2011110博达书店$BK-83035$43 BTW-08010 2011 年 1 月 11 日 2011年1月11日 2011111隆华书店$BK-83022$22 BTW-08011 2011 年 1 月 11 日 2011年1月11日 2011111鼎盛书店$BK-83023$31 BTW-08012 2011 年 1 月 12 日 2011年1月12日 2011112隆华书店$BK-83032$19 BTW-08013 2011 年 1 月 12 日 2011年1月12日 2011112鼎盛书店$BK-83036$43 BTW-08014 2011 年 1 月 13 日 2011年1月13日 2011113隆华书店$BK-83024$39 BTW-08015 2011 年 1 月 15 日 2011年1月15日 2011115鼎盛书店$BK-83025$30 BTW-08016 2011 年 1 月 16 日 2011年1月16日 2011116鼎盛书店$BK-83026$43 BTW-08017 2011 年 1 月 16 日 2011年1月16日 2011116鼎盛书店$BK-83037$40BTW-08461 2012 年 5 月 2 日 2012年5月2日 201252隆华书店$BK-83027$11 BTW-08462 2012 年 5 月 2 日 2012年5月2日 201252鼎盛书店$BK-83028$2 BTW-08463 2012 年 5 月 3 日 2012年5月3日 201253隆华书店$BK-83029$23 BTW-08464 2012 年 5 月 3 日 2012年5月3日 201253鼎盛书店$BK-83030$1 BTW-08465 2012 年 5 月 4 日 2012年5月4日 201254隆华书店$BK-83031$36 BTW-08466 2012 年 5 月 7 日 2012年5月7日 201257博达书店$BK-83035$23 BTW-08467 2012 年 5 月 8 日 2012年5月8日 201258隆华书店$BK-83022$44 BTW-08468 2012 年 5 月 8 日 2012年5月8日 201258博达书店$BK-83023$47 BTW-08469 2012 年 5 月 9 日 2012年5月9日 201259博达书店$BK-83032$32

思路:

  1. 创建原始表:
    创建一个表来存储销售记录数据,包括流水单号、交易时间、书店名称、图书编号和售出数量等字段。
    指定表的字段类型和分隔符,以便正确解析数据。
  2. 导入数据:
    将销售记录数据导入Hive表中,可以使用Hive的LOAD DATA INPATH命令将数据从HDFS加载到表中。
  3. 创建分区表:
    创建一个分区表来存储按书店和分区划分的销售数据。
    定义分区字段,例如书店名称和分区号。
    指定表的字段类型和分隔符。
  4. 添加静态分区:
    使用Hive的ALTER TABLE语句为分区表添加静态分区。
    指定分区的名称和对应的书店名称和分区号。
  5. 计算并保存每年书本销量Top3到分区表:
    使用Hive的窗口函数和子查询来计算每个书店每年的书本销量,并按销量降序排序。
    使用Hive的INSERT INTO语句将计算结果插入到分区表中的相应分区。
    可以使用ROW_NUMBER()函数为每个书店的销量排名,并限制只保存销量Top3的数据。
  6. 查看分区中的数据:
    使用Hive的SELECT语句查询分区表中的数据。
    根据需要指定分区的条件,并按照需要进行排序和格式化结果。

##检查hive配置:

1.先检查配置hive-site.xml(关键步骤)中的IP地址是否与windows下的IP一致

查看windows下的IP,无线局域网IP
ipconfig
进入hive-site.xml 更其中的IP与windows中的IP相同:

注意hive在那个目录下,在根目录的话就是这个命令

cd hive/conf/
vim hive-site.xml

2.启动hive

hive

3.创建原始表:

CREATE TABLE sales_data (
  serial_number STRING,
  transaction_date STRING,
  store_name STRING,
  book_code STRING,
  quantity_sold INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '$'
STORED AS TEXTFILE;

4.导入数据(hdfs下的文件路径)

LOAD DATA INPATH '/xsjl.txt' INTO TABLE sales_data;

5.创建分区表:

CREATE TABLE sales_data_partitioned (
  serial_number STRING,
  transaction_date STRING,
  book_code STRING,
  quantity_sold INT
)
PARTITIONED BY (store_name STRING, store_partition STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '$'
STORED AS TEXTFILE;

6. 添加静态分区(请根据喜好,更改SroreaA、B、C、D名):

ALTER TABLE sales_data_partitioned ADD PARTITION (store_name='StoreA', store_partition='1');
ALTER TABLE sales_data_partitioned ADD PARTITION (store_name='StoreB', store_partition='2');
ALTER TABLE sales_data_partitioned ADD PARTITION (store_name='StoreC', store_partition='3');
ALTER TABLE sales_data_partitioned ADD PARTITION (store_name='StoreD', store_partition='4');

7.将数据插入分区表,并按照年度和销量排序(请根据喜好,更改SroreaA、B、C、D名):

INSERT OVERWRITE TABLE sales_data_partitioned PARTITION (store_name='StoreA', store_partition='1')
SELECT serial_number, transaction_date, book_code, quantity_sold
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY store_name ORDER BY transaction_date DESC, quantity_sold DESC) AS rn
  FROM sales_data
) tmp
WHERE store_name = '鼎盛书店' AND rn <= 3;

INSERT OVERWRITE TABLE sales_data_partitioned PARTITION (store_name='StoreB', store_partition='2')
SELECT serial_number, transaction_date, book_code, quantity_sold
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY store_name ORDER BY transaction_date DESC, quantity_sold DESC) AS rn
  FROM sales_data
) tmp
WHERE store_name = '博达书店' AND rn <= 3;

INSERT OVERWRITE TABLE sales_data_partitioned PARTITION (store_name='StoreC', store_partition='3')
SELECT serial_number, transaction_date, book_code, quantity_sold
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY store_name ORDER BY transaction_date DESC, quantity_sold DESC) AS rn
  FROM sales_data
) tmp
WHERE store_name = '隆华书店' AND rn <= 3;

INSERT OVERWRITE TABLE sales_data_partitioned PARTITION (store_name='StoreD', store_partition='4')
SELECT serial_number, transaction_date, book_code, quantity_sold
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY store_name ORDER BY transaction_date DESC, quantity_sold DESC) AS rn
  FROM sales_data
) tmp
WHERE store_name NOT IN ('鼎盛书店', '博达书店', '隆华书店') AND rn <= 3;

8.数据查询:

SELECT * FROM sales_data_partitioned WHERE store_name='StoreA' AND store_partition='1';
SELECT * FROM sales_data_partitioned WHERE store_name='StoreB' AND store_partition='2';
SELECT * FROM sales_data_partitioned WHERE store_name='StoreC' AND store_partition='3';
SELECT * FROM sales_data_partitioned WHERE store_name='StoreD' AND store_partition='4';

结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值