数仓项目关于sqoop导出ads层数据到mysql 您所在的位置:网站首页 ads建表 数仓项目关于sqoop导出ads层数据到mysql

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

2023-08-07 22:16| 来源: 网络整理| 查看: 265

导出原因

因为我们需要对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中检查,发现有数据,则同步完成



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有