Sqoop从MySQL增量导入数据到Hive的last-value相关问题咨询
Sqoop增量导入使用问题解答
问题1:last-value参数是否需要手动填写
- 首次使用
sqoop job --create创建持久化作业时,需要手动填写初始的--last-value值,该值代表首次增量导入的起始边界,比如之前已经全量导入了主键id到1000的数据,首次创建增量作业时直接填1000即可。 - 首次执行该作业完成后,Sqoop会自动将本次导入抓取到的
check-column列的最大值,持久化存储到作业的元数据中。后续只需要执行sqoop job --exec <你的作业名>即可,不需要再手动修改last-value参数,Sqoop会自动读取上一次存储的边界值作为本次导入的起始值。 - 如果你不使用持久化作业,只是单次执行
sqoop import增量导入命令,那么每次执行都需要手动填写last-value参数。
问题2:check-column和last-value对应的列是否必须是主键
不需要是主键,只需要匹配你使用的增量模式的要求即可:
- 如果你用
--incremental append增量模式(仅导入新增数据,匹配你的业务场景):check-column对应列只要是严格单调递增即可,不会出现后续写入的数据的该列值比之前已导入数据的该列值小的情况。常见的可用列除了自增主键之外,还有数据写入时间列(比如create_time,新写入数据的创建时间一定晚于历史数据)。 - 如果你用
--incremental lastmodified增量模式(需要同步已有数据的更新时使用):check-column必须是时间类型的列,且数据新增或更新时该列的值会同步更新为当前时间。 - 注意:不要选择会被随意更新的非单调列作为
check-column,否则会出现数据漏导、重复导入的问题。
示例命令修正提示
你提供的命令有两处错误需要调整:
--num-mappers的参数不能为负数,需要传入正整数,比如--num-mappers 4--check-column后面需要指定你用作校验的列名,比如--check-column id或者--check-column create_time
内容的提问来源于stack exchange,提问作者DrGenius
相关产品推荐
相关产品推荐

