操作技能试卷
注意:考试结束试卷必须交回,不交回试卷者成绩无效
一、环境要求Hadoop+Hive+Spark+HBase 开发环境。
二、提交结果要求
1.必须提交源码或对应分析语句,如不提交则不得分。
2.带有分析结果的功能,请分析结果的截图与代码一同提交。
三、数据描述
meituan_waimai_meishi.csv
是美团外卖平台的部分外卖 SPU(Standard Product Unit , 标准产品单元)数据,包含了外卖平台某地区一时间的外卖信息。具体字段说明如下:(表 1 美团外卖 SPU 商品数据字典)
字段名称 中文名称 数据类型
spu_id 商品 spuID String
shop_id 店铺 ID String
shop_name 店铺名称 String
category_name 类别名称 String
spu_name SPU 名称 String
spu_price SPU 商品售价 Double
spu_originprice SPU 商品原价 Double
month_sales 月销售量 Int
praise_num 点赞数 Int
spu_unit SPU 单位 String
spu_desc SPU 描述 String
spu_image 商品图片 String
四、功能要求
1.数据准备(10 分)
请在 HDFS 中创建目录/app/data/exam,并将 meituan_waimai_meishi.csv 文件传到该目录。并通过 HDFS 命令查询出文档有多少行数据。
2.使用 Spark,加载 HDFS 文件系统 meituan_waimai_meishi.csv 文件,并分别使用 RDD 和 Spark SQL 完成以下分析(不用考虑数据去重)。(50 分)
①统计每个店铺分别有多少商品(SPU)。
②统计每个店铺的总销售额。
③统计每个店铺销售额最高的前三个商品,输出内容包括店铺名,商品名和销售额,其中销售额为 0 的商品不进行统计计算,例如:如果某个店铺销售为 0,则不进行统计。
3.创建 HBase 数据表(5 分)
在 HBase 中创建命名空间(namespace)exam,在该命名空间下创建 spu 表,该表下有1 个列族 result。
4.请在 Hive 中创建数据库 spu_db , 在该数据库中创建外部表 ex_spu 指向/app/data/exam 下的测试数据 ;创建外部表 ex_spu_hbase 映射至 HBase 中的 exam:spu 表 的 result 列 族 (20分 )
ex_spu 表结构如下:
字段名称 中文名称 数据类型
spu_id 商品 spuID string
shop_id 店铺 ID string
shop_name 店铺名称 string
category_name 类别名称 string
spu_name SPU 名称 string
spu_price SPU 商品价格 double
spu_originprice SPU 商品原价 double
month_sales 月销售量 int
praise_num 点赞数 int
spu_unit SPU 单位 string
spu_desc SPU 描述 string
spu_image 商品图片 string
ex_spu_hbase 表结构如下:
字段名称 字段类型 字段含义
key string rowkey
sales double 销售额
praise int 点赞数
5.统计查询(15 分)
① 统计每个店铺的总销售额 sales, 店铺的商品总点赞数 praise,并将 shop_id 和
shop_name 的组合作为 RowKey,并将结果映射到 HBase。
② 完成统计后,分别在 hive 和 HBase 中查询结果数据。
1.数据准备(10 分)
请在 HDFS 中创建目录/app/data/exam,并将 meituan_waimai_meishi.csv 文件传到该目录。并通过 HDFS 命令查询出文档有多少行数据。
1.在 HDFS 中创建目录/app/data/exam hdfs dfs -mkdir -p /app/data/exam
2.将 meituan_waimai_meishi.csv 文件传到该目录 hdfs dfs -put meituan_waimai_meishi.csv /app/data/exam
3.查询出文档有多少行数据 hdfs dfs -cat /app/data/exam/meituan_waimai_meishi.csv | wc -l
2.使用 Spark,加载 HDFS 文件系统 meituan_waimai_meishi.csv 文件,并分别使用 RDD
和 Spark SQL 完成以下分析(不用考虑数据去重)。(50 分)
①统计每个店铺分别有多少商品(SPU)。
②统计每个店铺的总销售额。
③统计每个店铺销售额最高的前三个商品,输出内容包括店铺名,商品名和销售额,其中销售额为 0 的商品不进行统计计算,例如:如果某个店铺销售为 0,则不进行统计。
1.进入spark shell spark-shell
2.加载文件:val rdd=sc.textFile("hdfs://hadoop100:9000/app/data/exam/meituan_waimai_meishi.csv")
3.查看加载的数据
scala> rdd.collect.take(2).foreach(println)
spu_id,shop_id,shop_name,category_name,spu_name,spu_price,spu_originprice,month_sales,praise_num,spu_unit,spu_desc,spu_image
907742996,1036149152976425,冰火虾神小龙虾(西影路店),折扣,爆款麻辣小龙虾 ±20g/只 1,55.06,88.8,3,0,斤,克重:±20g/只,不吃龙虾辜负胃,狂撸三斤不嫌累!,http://p1.meituan.net/wmproduct/022b0eec55c894ee64b6faa4382163a91424176.jpg
4.统计每个店铺分别有多少商品 使用rdd
val first=rdd.first
rdd.filter(_!=first).map(x=>{
val str: Array[String] = x.split(",")
(str(2),1)
}).reduceByKey(_+_).collect().foreach(println)
打印结果:
(万和祥羊肉馆户县店,29)
(青木土豆粉,17)
(蒙阁轩羊肉焖面,71)
(冰火虾神小龙虾(西影路店),102)
(尚品米洛克,36)
(中国兰州拉面(乐居场店),136)
(煲状元煲仔饭,32)
(老城红油米线(丰润美食城店),23)
(喜辣屋泡泡鱼(小寨店),48)
(老台门(百脑汇店),72)
(鄠邑印象小厨,85)
(悦香驴蹄子面(曲江大悦城店),18)
(一菜一味,40)
(人人家美食城,113)
(云锦港式烧腊饭,42)
(三顾冒菜(曼城国际店),92)
(强社包子铺,26)
②统计每个店铺的总销售额。
rdd.filter(_!=first).map(x=>{
val str: Array[String] = x.split(",")
(str(2),str(5).toDouble*str(7).toDouble)
}).reduceByKey(_+_).collect().foreach(println)
(万和祥羊肉馆户县店,633.0)
(青木土豆粉,0.0)
(老城红油米线(丰润美食城店),0.0)
(蒙阁轩羊肉焖面,972.0)
(冰火虾神小龙虾(西影路店),4919.099999999999)
(喜辣屋泡泡鱼(小寨店),3901.0)
(鄠邑印象小厨,3676.0)
(老台门(百脑汇店),6250.199999999999)
(悦香驴蹄子面(曲江大悦城店),222.0)
(尚品米洛克,0.0)
(一菜一味,2297.0)
(人人家美食城,0.0)
(中国兰州拉面(乐居场店),842.0)
(云锦港式烧腊饭,144.0)
(煲状元煲仔饭,3728.0)
(三顾冒菜(曼城国际店),9497.7)
(强社包子铺,3389.08)
③统计每个店铺销售额最高的前三个商品,
输出内容包括店铺名,商品名和销售额,其中销售额为 0 的商品不进行统计计算,
例如:如果某个店铺销售为 0,则不进行统计。
rdd.filter(_!=first).map(x=>{
val str: Array[String] = x.split(",")
(str(2),str(4),str(5).toDouble*str(7).toDouble)
}).filter(_._3>0).groupBy(_._1).map(x=>{
val shop_id: String = x._1
val list: List[(String, String, Double)] = x._2.toList
val totalPrice: List[String] = list.sortBy(-_._3).take(3).map(x=>{x._2+"商品销售额:"+math.round(x._3*100)/100})
(shop_id,totalPrice)
}).collect.foreach(println)
打印结果
(万和祥羊肉馆户县店,List(水盆羊杂商品销售额:240, 辣子炒羊血商品销售额:120, 优质水盆羊肉商品销售额:96))
(蒙阁轩羊肉焖面,List(瘦肉焖面商品销售额:352, 羊肉焖面商品销售额:286, 鸡块焖面商品销售额:176))
(冰火虾神小龙虾(西影路店),List(冰火虾神套餐A商品销售额:396, 冰火虾神套餐A商品销售额:396, 麻辣小龙虾 ±25g/只 1斤商品销售额:280))
(喜辣屋泡泡鱼(小寨店),List(酸辣传奇(每份建议加配5-8个小菜)商品销售额:576, 酸辣传奇(每份建议加配5-8个小菜)商品销售额:576, 麻辣学院(每份建议加配5-8个小菜)商品销售额:414))
(老台门(百脑汇店),List(萝卜鲜蔬包商品销售额:376, 萝卜鲜蔬包商品销售额:376, 萝卜鲜蔬包商品销售额:376))
(鄠邑印象小厨,List(红烧肉商品销售额:384, 老碗鱼商品销售额:348, 茶树菇爆牛柳商品销售额:234))
(悦香驴蹄子面(曲江大悦城店),List(经典全套商品销售额:60, 经典全套商品销售额:60, 油泼四合一商品销售额:36))
(一菜一味,List(肉沫粉条商品销售额:273, 鱼香肉丝商品销售额:190, 米饭商品销售额:182))
(中国兰州拉面(乐居场店),List(炒面片商品销售额:72, 炒面片商品销售额:72, 丁丁炒面商品销售额:70))
(云锦港式烧腊饭,List(叉烧拼玫瑰豉油鸡+烤鸭蛋+例汤商品销售额:72, 叉烧拼玫瑰豉油鸡+烤鸭蛋+例汤商品销售额:72))
(煲状元煲仔饭,List(腊味双拼煲仔饭商品销售额:680, 腊味双拼煲仔饭商品销售额:680, 腊肠排骨煲仔饭商品销售额:300))
(三顾冒菜(曼城国际店),List(单人荤素+1个米饭商品销售额:588, 双人荤素+2个米饭商品销售额:350, 金针菇商品销售额:292))
(强社包子铺,List(香葱大肉包商品销售额:329, 香葱大肉包商品销售额:329, 芹菜酸菜包商品销售额:253))
3.创建 HBase 数据表(5 分)
在 HBase 中创建命名空间(namespace)exam,在该命名空间下创建 spu 表,该表下有1 个列族 result。
1.启动zookeeper: zkServer.sh start
2.启动hbase: start-hbase.sh
3.启动hive metastore元数据服务 hive --service metastore &
4.进入hbase shell: hbase shell
5.在 HBase 中创建命名空间(namespace)exam create_namespace 'exam'
6.在该命名空间下创建 analysis 表,该表下有 2 个列族 accuracy、question
hbase(main):011:0> create 'exam:spu', 'result'
4.请在 Hive 中创建数据库 spu_db , 在该数据库中创建外部表 ex_spu 指向/app/data/exam 下的测试数据 ;
创建外部表 ex_spu_hbase 映射至 HBase 中的 exam:spu 表 的 result 列 族 (20分 )
ex_spu 表结构如下:
字段名称 中文名称 数据类型
spu_id 商品 spuID string
shop_id 店铺 ID string
shop_name 店铺名称 string
category_name 类别名称 string
spu_name SPU 名称 string
spu_price SPU 商品价格 double
spu_originprice SPU 商品原价 double
month_sales 月销售量 int
praise_num 点赞数 int
spu_unit SPU 单位 string
spu_desc SPU 描述 string
spu_image 商品图片 string
ex_spu_hbase 表结构如下:
字段名称 字段类型 字段含义
key string rowkey
sales double 销售额
praise int 点赞数
create external table exam.ex_spu(
spu_id string,
shop_id string,
shop_name string,
category_name string,
spu_name string,
spu_price double,
spu_originprice double,
month_sales int,
praise_num int,
spu_unit string,
spu_desc string,
spu_image string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/app/data/exam'
tblproperties("skip.header.line.count"="1");
create external table exam.ex_spu_hbase(
key string,
sales double,
praise int)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties('hbase.columns.mapping'=':key,
result:sales,
result:praise')
tblproperties('hbase.table.name'='exam:spu');
5.统计查询(15 分)
① 统计每个店铺的总销售额 sales, 店铺的商品总点赞数 praise,并将 shop_id 和
shop_name 的组合作为 RowKey,并将结果映射到 HBase。
insert into exam.ex_spu_hbase
select concat_ws("-",shop_id,shop_name),sum(spu_price*month_sales) sales,sum(praise_num) praise
from exam.ex_spu
group by shop_id,shop_name
1003327012906578-人人家美食城 0.0 0
1032674524427407-尚品米洛克 0.0 0
1036149152976425-冰火虾神小龙虾(西影路店) 4919.099999999999 2
1039658141275795-三顾冒菜(曼城国际店) 9497.7 10
1049708364696533-强社包子铺 3389.08 6
1088195566642791-万和祥羊肉馆户县店 633.0 0
1110890173877240-老城红油米线(丰润美食城店) 0.0 0
1111100627223024-鄠邑印象小厨 3676.0 4
854317417536118-一菜一味 2297.0 0
864852972275612-云锦港式烧腊饭 144.0 0
894900563498780-煲状元煲仔饭 3728.0 0
948690733953481-悦香驴蹄子面(曲江大悦城店) 222.0 0
959436742068221-青木土豆粉 0.0 0
962550593394214-中国兰州拉面(乐居场店) 842.0 0
966888510343524-蒙阁轩羊肉焖面 972.0 2
978446267319834-喜辣屋泡泡鱼(小寨店) 3901.0 16
982633860481853-老台门(百脑汇店) 6250.199999999999 38
② 完成统计后,分别在 hive 和 HBase 中查询结果数据。
select * from exam.ex_spu_hbase;
scan 'exam:spu'