sqoop导入
Sqoop 导入:从 MySQL 到 HDFS,全量、增量、过滤、入 Hive,四种场景一套命令
Sqoop 导入,就是从关系型数据库往 Hadoop 搬数据。
四种常见场景,按复杂度从低到高:
| 场景 | 命令关键词 | 适合什么时候 |
|---|---|---|
| 全量导入 | --table |
第一次导入,把整张表拉过来 |
| 条件导入 | --where / --query |
只要部分行或部分列 |
| 增量导入 | --incremental |
每天只导新增数据 |
| 直入 Hive | --hive-import |
省掉中间步骤,直接进 Hive |
全量导入:整张表拉到 HDFS
最基础的用法,把 MySQL 的一张表完整导入 HDFS。
sqoop import \
--connect jdbc:mysql://localhost:3306/company \
--username root \
--password 123456 \
--table staff \
--target-dir /user/sqoop/company \
--delete-target-dir \
--fields-terminated-by "\t" \
--num-mappers 1
关键参数:
| 参数 | 说明 |
|---|---|
--table |
要导的表名 |
--target-dir |
HDFS 目标目录 |
--delete-target-dir |
目录存在就先删,避免报错(全量覆盖用) |
--fields-terminated-by |
字段分隔符(默认逗号) |
--num-mappers |
并行度,1 最稳,大表可调大 |
数据去哪了:
/user/sqoop/company/
└── part-m-00000 数据文件
条件导入:只导需要的数据
全量导入把整张表都拉过来,但有时候只需要部分行或部分列。
2.1 按行过滤(--where)
sqoop import \
--table staff \
--where "sex = 0 AND age > 18" \
--target-dir /user/sqoop/company_filter
只导满足条件的行。
2.2 按列过滤(--columns)
sqoop import \
--table staff \
--columns "name, age, sex" \
--target-dir /user/sqoop/company_columns
只导指定的列,减少数据传输量。
2.3 自定义 SQL(--query,最灵活)
sqoop import \
--query 'SELECT name, age FROM staff WHERE sex = 0 AND $CONDITIONS' \
--target-dir /user/sqoop/company_query \
--num-mappers 1
注意: $CONDITIONS 必须写,Sqoop 用它替换并行查询条件。缺了会报错。
增量导入:只导新增或变化的数据
全量导入只做一次,后续每天只需导新增的数据。
方式一:按递增 ID(Append 模式)
适用场景:表有自增 ID,新数据 ID 越来越大。
sqoop import \
--table staff \
--target-dir /user/sqoop/company \
--incremental append \
--check-column id \
--last-value 1000
只导 id > 1000 的数据。last-value 是上次导入的最大 ID。
方式二:按更新时间(LastModified 模式)
适用场景:表有更新时间字段,数据修改时更新时间戳。
sqoop import \
--table orders \
--target-dir /user/sqoop/orders \
--incremental lastmodified \
--check-column update_time \
--last-value "2024-01-01 00:00:00"
只导 update_time > 2024-01-01 的数据。
增量导入的数据会追加到 HDFS 目录,不会覆盖已有数据。
直入 Hive:省掉中间步骤
不需要先导到 HDFS 再建 Hive 表,一步到位。
sqoop import \
--table staff \
--hive-import \
--hive-table staff_hive \
--hive-overwrite \
--fields-terminated-by "\t"
做了什么:
- 数据先导到 HDFS 临时目录
- 自动执行
LOAD DATA INPATH把数据加载到 Hive 表
前提条件:
Hive 表要提前建好,或者允许 Sqoop 自动创建
$SQOOP_HOME/lib/里要有 Hive 的依赖包(hive-common.jar、hive-exec.jar)
常见问题
1. 导入慢
调大 --num-mappers,但别太大(数据库连接数有限)。
加 --batch 减少 JDBC 交互次数。
MySQL 可用 --direct 走 mysqldump 加速。
2. 数据里有分隔符导致字段错乱
用 --escaped-by 转义,或者换一个数据里不会出现的分隔符。
--fields-terminated-by "\001" -- 用不可见字符做分隔符
3. 直入 Hive 报错 ClassNotFoundException
Hive 依赖包没拷全:
cp $HIVE_HOME/lib/hive-common-*.jar $SQOOP_HOME/lib/
cp $HIVE_HOME/lib/hive-exec-*.jar $SQOOP_HOME/lib/