题目描述
样表(sales_sample_20170310)字段说明:
day_id 日期编号;
sale_nbr 卖出方代码;
buy_nbr 买入方代码;
cnt 数量
round 金额
卖出方和买入方又分为 3 种类型:
- 以’C’开头的表示类型为 C,代表“航空公司”,只可以卖出,不可以买入;
- 以’O’开头的表示类型为 O,代表“代理人”,既可以卖出,也可以买入,并且允许自己卖给自己(简单来讲:每个“代理人”代码可能对应多个售票点,售票点之前有交换票的情况,所以体现为自己卖给了自己);
- 'PAX’表示类型为 PAX,代表“旅客”,只可以买入,不可以卖出。
举例:
day_id,sale_nbr,buy_nbr,cnt,round1,C1,O1001,1,360
卖出方为 C1,类型为 C;买入方为 O1001,类型为 O
day_id,sale_nbr,buy_nbr,cnt,round1,O100,O100,4,2000
卖出方为 O100,类型为 O;买入方为 O100,类型为 O(即自己卖给自己是允许的)
day_id,sale_nbr,buy_nbr,cnt,round1,O100,PAX,4,2000
卖出方为 O100,类型为 O;买入方为 PAX,类型为 PAX
问题:
1、数据导入:
要求将样表文件中的(sales_sample_20170310)数据导入 HIVE 数据仓库中。
2、数据清洗:
要求将 day_id 一列中的数值清洗为真实的日期格式,可用字符串表示。
数据 1 对应日期 2021-09-01,依次类推,15 对应日期 2021-09-15
3、数据分析处理:
(1)统计每天各个机场的销售数量和销售金额。
要求的输出字段
day_id,sale_nbr,cnt,round
日期编号,卖出方代码,数量,金额
(2)统计每天各个代理商的销售数量和销售金额。
要求的输出字段
day_id,sale_nbr,cnt,round
日期编号,卖出方代码,数量,金额
(3)统计每天各个代理商的销售活跃度。
要求的输出字段
day_id,sale_nbr, sale_number
日期编号,卖出方代码,交易次数(买入或者卖出均算交易次数)
(4)汇总统计 9 月 1 日到 9 月 15 日之间各个代理商的销售利润。
编号,卖出方代码,买入数量,买入金额,卖出数量,卖出金额,销售利润(卖出金额-买入金额)
(5)设计分析代理商的市场地位根据市场交易次数、交易对象个数、销售机票数量、销售利润等(选做题)
4、处理结果入库:
将上述统计分析的结果数据保存到 mySQL 数据库中。
5、数据可视化展示:
利用 Echarts 将上述统计结果以图形化展示的方式展现出来:饼图、柱状图、地图、折线图等。
hadoop配置
首先安装好hadoop,我参考的b站视频:
登录3台虚拟机(均可联网):
主机(有桌面,Firefox):
从机1(无桌面):
从机2(无桌面):
注:打开主机终端方式如下
vi /etc/hosts
查看master的host文件:
之后 ping s1,没问题
可是xshell连接失败:
记得开启了 sshd 服务,再检查一遍,发现果然已经启动了:
之后发现子网ip竟然和上面的不对应,改过来就好了(记得不仅要重启虚拟机,还要重启电脑)
这样就可以了:
输入命令start-all.sh
启动hadoop:
输入jps
有:
通过hadoop jar ~/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar
命令看一下里面example里面自带的一些程序:
用hadoop jar ~/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar pi 10 10
尝试计算圆周率:
输入 http://master:8088/cluster,访问集群,可以看到执行的这个任务:
输入 http://master:50070/explorer.html#/wordcount/output,可以看到我之前操作的一些文件信息:
hive配置
我参考的b站视频:
hive版本要和自己的hadoop版本符合才可以:
https://hive.apache.org/downloads.html
https://dlcdn.apache.org/hive/hive-2.3.9/
启动hive
create table test(id int);
建立一个test表
insert into test values(1);
向test表中插入数据1
下载可以看到
mysql配置
我参考的b站视频:
输入schematool -initSchema -dbType mysql -verbose
初始化hive元数据库:
再次启动hive:
create table test(id int);
建立一个test表;
insert into test values(1);
向test表中插入数据2
select * from test;
查询,神奇的发现1这个数据还在
所以我们可以认为,只要往原路径下放数据,它均可以查到,而且建表和放数据的顺序随意
我们看下mysql数据库:
完成问题1,2
在hive里面建表:
具体语法可看:Hive建表语句详解–CREATE TABLE
create table test0 (
day_id string,
sale_nbr string,
buy_nbr string,
cnt int,
round double
)
ROW format delimited fields terminated by ',' STORED AS TEXTFILE;
结果:
hadoop fs -put /opt/software/sales.csv /user/hive/warehouse/test0
导入sales.csv文件;
select * from test0 limit 10;
查看前10条记录:
然后把日期清洗成标准格式:
cast()函数用法可看:mysql cast( as int) error_Mysql SQL CAST()函数
insert overwrite table test0
select date_add('2021-09-00',cast(day_id as int)) as day_id,
sale_nbr as sale_nbr,
buy_nbr as buy_nbr,
cnt as cnt,
round as round
from test0;
结果:
select * from test0 limit 10;
查看前10条记录:
zookeeper、hbase配置
借鉴:
【ZooKeeper】安装教程
hbase安装教程(操作简单可复制,含zookeeper安装)
zookeeper快速入门一:zookeeper安装与启动
zkServer.sh start
start-hbase.sh
sqoop配置
sqoop要和hadoop版本对应,这里下的1.4.7版本
http://archive.apache.org/dist/sqoop/1.4.7/
将文件放进Linux:
之后借鉴博客:
vi ~/.bash_profile
配置环境变量,source ~/.bash_profile
使其立即生效:
vi sqoop-env.sh
修改已经安装了的Hadoop组件
sqoop-version
看版本号:
发现有一些警告,想要去除(但是我hbase和zookeeper都配了,hbase都识别了,zookeeper却识别不了,吐了):
之后就可以了:
利用sqoop将hive数据导出到mysql
借鉴博客:
列出mysql数据库中的全部数据:
sqoop list-databases --connect jdbc:mysql://master:3306/ --username root --password xxx
将hive中的表数据导入到mysql中(表结构就跟你hive一样就行):
之后执行sql:
bin/sqoop export
--connect jdbc:mysql://master:3306/sales
--username root
--password xxx
--table test0
--num-mappers 1
--export-dir /user/hive/warehouse/test0
--input-fields-terminated-by ","
sql语句解释:
bin/sqoop export #表示数据从 hive 复制到 mysql 中
–username root #mysql登陆用户名
–password xxx #登录密码
–table test0 #mysql中的表,即将被导入的表名称
–export-dir /user/hive/warehouse/test0 #hive中被导出的文件
–input-fields-terminated-by "," #Hive 中被导出的文件字段的分隔符
运行结果:
排查原因,发现由于hive表里面没有主键,因此mysql里面不应该有主键,应该把主键去了:
之后执行代码:
结果如下:
注
对于之后的问题,做完会同步到博客上