一般在数仓中会使用到将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的解释https://www.cnblogs.com/youngchaolin/p/12271211.html
#或者合并成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(默认):不会新增新数据,只会修改里面的老数据



