0%

sqoop使用笔记

此文章记录个人使用sqoop遇到的问题及方法
(一)基础参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
①公共参数
--connect 指定MySQL的Url.
--username 指定MySQL用户名数据库密码
--password 指定MySQL数据库密码
--num-mappers 指定map的个数
--null-non-string '\\N' 导入时保证NULL值一致性
--null-string '\\N' 导入时保证NULL值一致性
--input-null-string '\\N' 导出时保证NULL值一致性
--input-null-non-string '\\N' 导出时保证NULL值一致性


②MySQL导入HDFS的参数
--table usertable 指定MySQL的表名
--where "" 指定MySQL表的过滤条件
--query 'and $CONDITIONS' 指定MySQL表及过滤条件(不能和table一起用)
--fields-terminated-by '' 指定HDFS文件的字段分隔符
--lines-terminated-by '' 指定HDFS文件的换行符
--delete-target-dir 若目标路径已存在即删除
--split-by 根据哪个字段来分片


③MySQL导入Hive表的参数
--hive-import 设置导入目标为Hive表
--table 指定MySQL的表名
--columns 指定需筛选的字段
--where "" 指定MySQL表的过滤条件
--hive-table 指定目标Hive表
--hive-partition-key 指定Hive分区字段
--hive-partition-value 指定Hive某个分区
--delete-target-dir 若目标路径已存在即删除
--fields-terminated-by '' 指定HDFS文件的字段分隔符
--lines-terminated-by '' 指定HDFS文件的换行符
--hive-overwrite 覆盖模式
--hive-drop-import-delims 把字符串中\n\r\01删除
--hive-delims-replacement '' 用空格替换特殊字符
--create-hive-table 建表,如果表已经存在,该操作会报错!
--map-column-hive 为配置的列覆盖从SQL类型到Hive类型的默认映射(id = int格式)


备注:
1.Hive需要手动建表,字段类型必须相对应,否则会出现truefalse的值,导致数据不一致。
2.query和table不能一起用,否则有冲突时无法确定源表。
3.map-column-hive参数需要指定列及对应的类型,不如手动建表或写脚本。
4.bit布尔型导入时,1=true ,2=false
5.原表主键为文本格式时:sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true"
6.hive不支持mysql的binary类型

(二)MySQL使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#1.导入数据示例
sqoop import \
--connect jdbc:mysql://aliyun5201314:3306/jianyeo2o \
--username root \
--password root \
--table usertable \
--num-mappers 1 \
--hive-import \
--delete-target-dir \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table rds_jianyeo2o.ods_usertable \
--null-string '\\N' \
--null-non-string '\\N' \
--where "createtime is not null" \
--hive-drop-import-delims

#2.导出数据示例
sqoop export
--connect jdbc:mysql://520.13.14.9999:250/ads_we7 \
--username root \
--password root \
--table ads_house_cust_first \
--num-mappers 3 \
--input-fields-terminated-by '\001' \
--export-dir /user/hive/warehouse/wxslb.db/ads_house_cust_first \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--staging-table ads_house_cust_first_tmp \
--clear-staging-table


#3.无需建表直接导入
sqoop import \
--connect jdbc:mysql://520.13.14.9999:250/ods_o2oshop \
--username root \
--password root \
--table iskyshop_goodscart \
--num-mappers 50 \
--hive-import \
--delete-target-dir \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table rds_iskyshop.ods_iskyshop_goodscart \
--create-hive-table \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-delims-replacement ' '


#4.导入时指定时区(避免报错java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -> 3)
sqoop import \
--connect "jdbc:mysql://520.13.14.9999:250/love?tinyInt1isBit=false&serverTimezone=Asia/Shanghai" \
--username root \
--password root \
--table dwd_ann_log_appinfo \
--hive-import \
--num-mappers 40 \
--delete-target-dir \
--fields-terminated-by "\t" \
--hive-overwrite \
--create-hive-table \
--hive-table LeleWeather.dwd_event_appinfo_history1 \
--where "datekey <= 20210601" \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-delims-replacement ''

注:一定记得url加引号,否则&无法正确解析,将报错-bash: --username: 未找到命令

(三)sqlServer使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#1.列出数据库
sqoop list-databases --connect "jdbc:sqlserver://520.13.14.9999:250" -username root -password 'root'

#2.列出库下所有表
sqoop list-tables --connect "jdbc:sqlserver://520.13.14.9999:250;DatabaseName=love" -username root -password 'root'

#3.查询表数据
sqoop eval --connect "jdbc:sqlserver://520.13.14.9999:250" -username root -password 'root' --query "SELECT top 1 * from reportHouse.dbo.fact_userInfo"

#4.导入
sqoop import \
--connect "jdbc:sqlserver://520.13.14.9999:250;DatabaseName=love" \
--username root \
--password root \
--query 'select top 2 * from reportHouse.dbo.fact_userInfo WHERE $CONDITIONS' \
--num-mappers 1 \
--hive-import \
--target-dir /user/hive/warehouse/mht.db/ods/fact_userInfo_loadtest \
--delete-target-dir \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table mht.fact_userInfo_loadtest \
--create-hive-table \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-delims-replacement ' '

(四)函数封装sqoop脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# 定义一个函数,执行sqoop命令,所以执行脚本应该在sqoop/bin下面
sq()
{
sqoop import \
--connect jdbc:mysql://520.13.14.9999:250/love \
--username root \
--password root \
--table $1 \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-database yyplatform \
--hive-table $1
--null-string '\\N' \
--null-non-string '\\N' \
--hive-delims-replacement ' '
}

sq iskyshop_activeinfo
sq iskyshop_activeinfo_goods
sq iskyshop_address
sq iskyshop_area
sq iskyshop_brand
sq iskyshop_chosengoods
sq iskyshop_choseninfo
sq iskyshop_chosenuser

持续更新中……