Hadoop项目流程:Hive2MySQL--double_happy

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_39557512/article/details/101205253

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讲解

猜你喜欢

转载自blog.csdn.net/weixin_39557512/article/details/101205253