数仓项目关于sqoop导出ads层数据到mysql

导出原因

因为我们需要对ads得到的数据做数据可视化,一般是java来做的,如果是大数据自己做,那么直接用hive这边的数据就好了,可是如果是java来做,就需要把ads的数据传到mysql中。

关于导出去重

ads数据导出到MySQL中最重要的问题就是去重,因为我们是全量同步,那么假设我们刚开始只有14号数据,导入到mysql中,那么第二天我们导入过去的就是14号和15的数据,那么如果追加到mysql中,就会出现有14,14,15号的数据,所以,如何对mysql中的数据进行去重就是最关键的事情。

关于去重的方法,我们选用合理的主键,来对mysql中的数据进行去重

同步步骤

第一步:我们需要在mysql中创建同名同字段的一张表用来放ads的数据(注意,表明字段名必须都完全相同)这里举例拿
ads_user_topic来看,在hive中它的创建语句如下
在这里插入图片描述
在mysql中在sqoop传数据之前就要创建好一张对应表,代码如下
在这里插入图片描述
我们可以看见表名和字段名都是一样的,主键选择为dt,也就是日期,那么我们在mysql导入的时候就会通过时间来区分是否重复,如果重复会覆盖上次日期的数据。但是这是因为ads_user_topic这张表一天就一条数据,那么如果我们一天有多条数据的话,就需要增加主键。
比如,hive中的地区主题表,每天有多条数据(因为每个地区每天都有条数据),这样的就需要多选一个主键
在这里插入图片描述
在mysql中创建表为在这里插入图片描述
注意主键多加了一个地区字段。
然后在mysql中创建数据库专门用来放ads层导出数据
在这里插入图片描述
在这个数据库下创建两张表
在这里插入图片描述
然后开始编写ads导出到mysql的脚本

#!/bin/bash

hive_db_name=gmall
mysql_db_name=gmall_report

export_data() {
/opt/module/sqoop/bin/sqoop export \
-Dmapreduce.job.queuename=hive \
--connect "jdbc:mysql://hadoop102:3306/${mysql_db_name}?useUnicode=true&characterEncoding=utf-8"  \
--username root \
--password 000000 \
--table $1 \
--num-mappers 1 \
--export-dir /warehouse/$hive_db_name/ads/$1 \
--input-fields-terminated-by "\t" \
--update-mode allowinsert \
--update-key $2 \
--input-null-string '\\N'    \
--input-null-non-string '\\N'
}

case $1 in
  "ads_uv_count")
     export_data "ads_uv_count" "dt"
;;
  "ads_user_action_convert_day") 
     export_data "ads_user_action_convert_day" "dt"
;;
  "ads_user_topic")
     export_data "ads_user_topic" "dt"
;;
  "ads_area_topic")
     export_data "ads_area_topic" "dt,iso_code"
;;
   "all")
     export_data "ads_user_topic" "dt"
     export_data "ads_area_topic" "dt,iso_code"
     #其余表省略未写
;;
esac

(1)首先定义两个变量,没什么好说的,然后使用sqoop的脚本,后面的export表示是导出,原先在使用sqoop往hdfs导入的时候,使用的参数为import。
(2)下一行-Dmapreduce.job.queuename=hive \表示我们使用的yarn调度队列指定为hive的队列
(3)connect为连接参数,找到连接的mysql端口和哪个数据库,最后面是编码格式为utf-8
(4)然后底下两行为mysql登录用户账号和密码
(5)之后这个table表示为输入这个函数的第一个变量,在底下的调用函数部分我们可以看到,传进去的就是mysql中我们放数据的表名
(6)–num-mappers 1 \ 写死map只有一个
(7)export-dir :表示我们要将hdfs上的哪个目录下的数据导出到mysql,注意这里使用的参数和第五步中的参数是一样的,但这里其实是指hive中的表名,但是因为hive中的表名肯定和mysql中的表名是一样的,所以使用的参数也是一样的
(8)input-fields-terminated-by “\t” \ :因为hdfs上的ads数据已经是分割好的数据了,我们插入mysql中要告诉是以什么符号分割的。
(9)update-mode :也就是我们同步的等级,一般分为两种updateonly 只更新,无法插入新数据,allowinsert 允许新增
因为我们肯定要插入新数据,所以这里的参数选择allowinsert
(10)update-key : 即我们选择同步的主键,这个参数可以看到在脚本最后调用的时候,可以放多个字段
(11)–input-null-string和–input-null-non-string:分别表示,将字符串列和非字符串列的空串和“null”转义。Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。在导出数据时采用–input-null-string和–input-null-non-string两个参数。导入数据时采用–null-string和–null-non-string。

配置好之后启动脚本即可
在这里插入图片描述
然后去hadoop的历史服务器中可以看到map就启动了一个
在这里插入图片描述
运行结束后可以去mysql中检查,发现有数据,则同步完成


版权声明:本文为weixin_45425054原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。