版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Hive统计表
不管使用Hive统计的结果是什么维度,统计的结果表选择:
1.external
2.partition
就是分区+外部表
平台报表别人如何访问呢:
1.使用hiveservie2 使用jdbc方式去连接 可以 生产上不这么用
2.最好把数据倒入mysql里面 ***** 那么下面就是基于这个思路进行讲解
Hdfs --》Mysql 这里使用Sqoop 到Spark那块就不用Sqoop了 太low了
使用Sqoop把Hive里数据倒入MySQL 注意的点
注意:
Hive里表的设计 :分区字段 要在Hive建表的时候 多一个字段 代表分区字段
hdfs上的数据是三个字段不算分区的 mySQL里面要对应上
分区字段不能作为最终字段来使用的在mysql中(sqoop)
所以在Sqoop的时候要指定上字段而且还要指定分割符
对于hive来讲默认的分割符是\001
不然会报错 如下:
解决办法就是:
Hive表 + Sqoop 使用
MySQL里表:需要Hive表里的哪几个字段就创建什么样的表
create table platform_stat(
platform varchar(20),
cnt int,
d varchar(8)
)engine=innodb default charset=utf8;
Hive里表设计:
create table dwd_platform_stat_info(
platform string,
cnt int,
d string
) partitioned by(day string)
location '/hadoop/project/platform_stat';
Sqoop使用:Sqoop 在什么地方执行 那么 能够地方会有一个java文件生成
sqoop export \
--connect jdbc:mysql://localhost:3306/hive_dwd \
--password wsx123$%^ \
--username root \
--mapreduce-job-name Platform_info_Hive2MySQL \
--columns "platform,cnt,d" \
--input-fields-terminated-by '\001' \
--table platform_stat \
--export-dir /hadoop/project/platform_stat/day=20190921
查看MySQL表结果:
脚本封装:
#!/bin/bash
if [ $# -eq 1 ]; then
time=$1
else
time=`date -d "yesterday" +%Y%m%d`
fi
#platforma_state 数据统计
hive -e "
use homework;
insert overwrite table dwd_platform_stat_info partition(day=${time})
select platform , count(1) ,day as d from access_wide where day ='${time}' group by platform,day ;
"
#Sqoop platforma_state_Hive2MySQL
sqoop export \
--connect jdbc:mysql://localhost:3306/hive_dwd \
--password wsx123$%^ \
--username root \
--mapreduce-job-name Platform_info_Hive2MySQL \
--columns "platform,cnt,d" \
--input-fields-terminated-by '\001' \
--table platform_stat \
--export-dir /hadoop/project/platform_stat/day=${time}
存在的问题:
按上面的脚本走 如果多次导入同一天的数据
MySQL里面会有重复数据的
数据是有重复的
解决MySQL数据重复:
这块只要把上次导入的日期数据删掉就可以了
脚本封装:
#!/bin/bash
if [ $# -eq 1 ]; then
time=$1
else
time=`date -d "yesterday" +%Y%m%d`
fi
#platforma_state 数据统计
echo "-------------------------------------------------------------------------------------------"
echo "step : hive -e ---> insert data to platforma_state table"
echo "-------------------------------------------------------------------------------------------"
hive -e "
use homework;
insert overwrite table dwd_platform_stat_info partition(day=${time})
select platform , count(1) ,day as d from access_wide where day ='${time}' group by platform,day ;
"
#登陆MySQL 删除上次 处理日期 表中数据
echo "-------------------------------------------------------------------------------------------"
echo "step : MySQL ---> delete last time process ${time} data"
echo "-------------------------------------------------------------------------------------------"
MySQL_USER='root'
MySQL_PASSWD='wsx123$%^'
SQL_RESULT=`
mysql \
--user="${MySQL_USER}" \
--password="${MySQL_PASSWD}" \
-e "select count(1) as cnt from hive_dwd.platform_stat where d = ${time};" | tail -1
`
echo "-------------------------------------------------------------------------------------------"
echo "MySQL last time ${time} data size :${SQL_RESULT}"
echo "-------------------------------------------------------------------------------------------"
if [ ${SQL_RESULT} -ne 0 ] ; then
mysql --user="${MySQL_USER}" --password="${MySQL_PASSWD}" \
-e "delete from hive_dwd.platform_stat where d = ${time};"
echo "-------------------------------------------------------------------------------------------"
echo "Delete Mysql last time ${time} data done ,next step do Sqoop : Hive 2 MySQL"
echo "-------------------------------------------------------------------------------------------"
fi
#Sqoop platforma_state_Hive2MySQL
echo "-------------------------------------------------------------------------------------------"
echo "step : sqoop --> Hive 2 MySQL "
echo "-------------------------------------------------------------------------------------------"
sqoop export \
--connect jdbc:mysql://localhost:3306/hive_dwd \
--password wsx123$%^ \
--username root \
--mapreduce-job-name Platform_info_Hive2MySQL \
--columns "platform,cnt,d" \
--input-fields-terminated-by '\001' \
--table platform_stat \
--export-dir /hadoop/project/platform_stat/day=${time}
error=$?
if [ $error == 0 ] ; then
echo "-------------------------------------------------------------------------------------------"
echo "${time} work suceess"
echo "-------------------------------------------------------------------------------------------"
fi
任务调度
下一个博客Azkaban讲解