背景
一般在数仓中会使用到将mysql中的数据导入到hdfs层,与将hdfs层经过计算的结果重新导回mysql的情况,这种情况下就需要对sqoop的导入导出参数进行配置。
导入命令
sqoop import \
--connect jdbc:mysql://hadoop102:3306/gmall \
--username root --password root \
--table user_info \
--columns id,login_name \
--where 'id>=1 and id<=20' \
--target-dir /user_info \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--split-by id \
--compress \
--compression-codec lzop \
--null-string '\\N' \
--null-non-string '\\N'
导入参数说明
1)从mysql中读取gmall数据库的user_info表中id和login_name两个列其中id在1-20之间的
2)--target-dir是上传到hdfs的根目录下的user_info
3)--delete-target-dir意思是首先会删除目标目录因为怕这里面有数据,就和mr中输出目录也不能存在一样
4)--fields-terminated-by因为mysql上数据都是结构话的,所以导入到hdfs上需要有分隔符
5)--num-mappers指明sqoop任务的mapper个数,默认是4,因为sqoop只有map没有reduce
6)--split-by是map端对文件的切片,比如这里有1-20份数据,那么会根据id将1-10为一份,11-20为一份,因为这是根据--num mappers切的,比如这里对id切分就是默认对半切分(id数/map个数)
7)如果mappers个数为1就没必要传split-by参数了
8)--compress 表明输出的文件需要压缩
9)--compression-codec 声明压缩格式
10)以下两个参数声明mysql中的null要以什么形式保存,默认为null,这里为\N,因为数据要到hive中,hive中的null值就是\N
11)--null-string含义是 string类型的字段,当Value是NULL,替换成指定的字符,该例子中为\N
12)--null-non-string 含义是非string类型的字段,当Value是NULL,替换成指定字符,该例子中为\N
#$CONDITIONS的解释
导入命令改进版
#或者合并成query+sql语句的形式,这样的话其中$CONDITIONS是必加的,相当于占位符
sqoop import \
--connect jdbc:mysql://hadoop102:3306/gmall \
--username root --password root \
--query 'select id,login_name from user_info where id>=1 and id<=20 and $CONDITIONS' \
--target-dir /user_info \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--split-by id
导出命令
sqoop export \
--connect "jdbc:mysql://hadoop102:3306/${mysql_db_name}?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password root \
--table $1 \ # 指的是mysql中的表,sqoop只认hdfs中文件不认hive表
--num-mappers 1 \ #保证数据的顺序性
--export-dir /warehouse/$hive_db_name/ads/$1 \ # hdfs上的文件目录,也就是hive的表名,这里的表名与mysql的表名可以不一样,但是里面的数据和字段顺序要一样
--input-fields-terminated-by "\t" \ # 要和ads层文件中的分隔符保持一致
--update-mode allowinsert \ # 解释在下方
--update-key $2 \ # 用这个来判断新插入的数据在mysql表中存不存在,所以这里传的参数就是目标表的组合唯一键,保证数据能插入
--input-null-string '\\N' \ # 将hive中的\N都变成null值存入mysql中
--input-null-non-string '\\N'
导出参数说明
1) sqoop有两种导出模式:
2) 一种是insert,将导出的数据翻译成insert语句;因为sqoop只会导入全量数据,会和里面存在的重复字段出现insert冲突
3) 一种是update,将数据翻译成update语句,它又分两种小模式:
3.1) allowinsert:若数据在mysql存在,就用新导入的数据对他进行覆盖,不存的数据进入导入
3.2) updateonly(默认):不会新增新数据,只会修改里面的老数据