您现在的位置是:首页 >其他 >hive改造MapReduce(临时篇)网站首页其他
hive改造MapReduce(临时篇)
hive改造MapReduce(临时篇)
【问题4】[编程题]请用Hive实现“2023春-作业3”中MR编程题的需求,并给出你的解题思路和过程简述
某市连锁书店共有4个门店,每个门店的每一笔图书销售记录都会自动汇总到该市分公司的销售系统后台,销售记录数据如下(约100万数量级): BTW-08001 2011 年 1 月 2 日 2011年1月2日 2011年1月2日鼎盛书店$BK-83021$12 BTW-08002 2011 年 1 月 4 日 2011年1月4日 2011年1月4日博达书店$BK-83033$5 BTW-08003 2011 年 1 月 4 日 2011年1月4日 2011年1月4日博达书店$BK-83034 41...... 其中记录样例说明如下: / / [ 流水单号 ] 41 ...... 其中记录样例说明如下: //[流水单号] 41......其中记录样例说明如下://[流水单号][交易时间] [ 书店名称 ] [书店名称] [书店名称][图书编号]$[售出数量] BTW-08001 2011 年 1 月 2 日 2011年1月2日 2011年1月2日鼎盛书店$BK-83021$12 年底,公司市场部需要统计年度各门店图书热销Top3,并做成4张报表上报公司经理,根据书店分区;请在MR框架下编程实现这个需求,数据表名为xsjl_1.txt,对应数据如下:BTW-08001 2011 年 1 月 2 日 2011年1月2日 2011年1月2日鼎盛书店$BK-83021$12 BTW-08002 2011 年 1 月 4 日 2011年1月4日 2011年1月4日博达书店$BK-83033$5 BTW-08003 2011 年 1 月 4 日 2011年1月4日 2011年1月4日博达书店$BK-83034$41 BTW-08004 2011 年 1 月 5 日 2011年1月5日 2011年1月5日博达书店$BK-83027$21 BTW-08005 2011 年 1 月 6 日 2011年1月6日 2011年1月6日鼎盛书店$BK-83028$32 BTW-08006 2011 年 1 月 9 日 2011年1月9日 2011年1月9日鼎盛书店$BK-83029$3 BTW-08007 2011 年 1 月 9 日 2011年1月9日 2011年1月9日博达书店$BK-83030$1 BTW-08008 2011 年 1 月 10 日 2011年1月10日 2011年1月10日鼎盛书店$BK-83031$3 BTW-08009 2011 年 1 月 10 日 2011年1月10日 2011年1月10日博达书店$BK-83035$43 BTW-08010 2011 年 1 月 11 日 2011年1月11日 2011年1月11日隆华书店$BK-83022$22 BTW-08011 2011 年 1 月 11 日 2011年1月11日 2011年1月11日鼎盛书店$BK-83023$31 BTW-08012 2011 年 1 月 12 日 2011年1月12日 2011年1月12日隆华书店$BK-83032$19 BTW-08013 2011 年 1 月 12 日 2011年1月12日 2011年1月12日鼎盛书店$BK-83036$43 BTW-08014 2011 年 1 月 13 日 2011年1月13日 2011年1月13日隆华书店$BK-83024$39 BTW-08015 2011 年 1 月 15 日 2011年1月15日 2011年1月15日鼎盛书店$BK-83025$30 BTW-08016 2011 年 1 月 16 日 2011年1月16日 2011年1月16日鼎盛书店$BK-83026$43 BTW-08017 2011 年 1 月 16 日 2011年1月16日 2011年1月16日鼎盛书店$BK-83037$40BTW-08461 2012 年 5 月 2 日 2012年5月2日 2012年5月2日隆华书店$BK-83027$11 BTW-08462 2012 年 5 月 2 日 2012年5月2日 2012年5月2日鼎盛书店$BK-83028$2 BTW-08463 2012 年 5 月 3 日 2012年5月3日 2012年5月3日隆华书店$BK-83029$23 BTW-08464 2012 年 5 月 3 日 2012年5月3日 2012年5月3日鼎盛书店$BK-83030$1 BTW-08465 2012 年 5 月 4 日 2012年5月4日 2012年5月4日隆华书店$BK-83031$36 BTW-08466 2012 年 5 月 7 日 2012年5月7日 2012年5月7日博达书店$BK-83035$23 BTW-08467 2012 年 5 月 8 日 2012年5月8日 2012年5月8日隆华书店$BK-83022$44 BTW-08468 2012 年 5 月 8 日 2012年5月8日 2012年5月8日博达书店$BK-83023$47 BTW-08469 2012 年 5 月 9 日 2012年5月9日 2012年5月9日博达书店$BK-83032$32
思路:
- 创建原始表:
创建一个表来存储销售记录数据,包括流水单号、交易时间、书店名称、图书编号和售出数量等字段。
指定表的字段类型和分隔符,以便正确解析数据。 - 导入数据:
将销售记录数据导入Hive表中,可以使用Hive的LOAD DATA INPATH
命令将数据从HDFS加载到表中。 - 创建分区表:
创建一个分区表来存储按书店和分区划分的销售数据。
定义分区字段,例如书店名称和分区号。
指定表的字段类型和分隔符。 - 添加静态分区:
使用Hive的ALTER TABLE
语句为分区表添加静态分区。
指定分区的名称和对应的书店名称和分区号。 - 计算并保存每年书本销量Top3到分区表:
使用Hive的窗口函数和子查询来计算每个书店每年的书本销量,并按销量降序排序。
使用Hive的INSERT INTO语句将计算结果插入到分区表中的相应分区。
可以使用ROW_NUMBER()函数为每个书店的销量排名,并限制只保存销量Top3的数据。 - 查看分区中的数据:
使用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';