最近在办公的时候,通常用的sqoop从pg数据库抽到hive竟然出现了数据量出错的问题,通过查看sqoop日志发现抽过来的数据量很不对劲,排查发现是--split-by参数设置的问题。
注意:这个是大坑,不要只看sqoop执行成功就完事儿了。
先来讲解一下sqoop中 --split-by参数的含义,这个参数的意义其实很简单,它一般是和-m来搭配使用的。该参数主要是用来**提高数据抽取的效率**,使得多个map并发执行抽取的操作。
比如要从pg数据库(只是举个例子,oracle、mysql同理)抽到hive,我们要用sqoop抽取其数据库中一个表的所有数据。像大数据这块儿,上百万的数据量是常有的事情,如果不设置--split-by,sqoop会默认一条条来抽取,直到把整个数据库表中的数据抽完。可见这是一个单一map在执行逐条抽取的操作,可想而知效率会变得比较低。
但是如果用--split-by这就不一样了,我们可以用--split-by来指定所抽取表中的一个字段,然后用-m来指定抽取的时候有多少个map并发执行抽取,这样就可以大大提高抽取的效率。
比如所抽取表中有一个字段 grade int comment '成绩' ,那这个时候就可以把sqoop的参数设置为这样:--split-by grade -m 4 。这就代表着sqoop从该表抽取数据的时候,将根据grade这个字段数值的范围,来把整个表的数据划分成4块儿,然后4个map并发执行抽取数据,每一个map抽取它所负责的grade范围所对应的数据量。具体这4块儿怎么划分范围的呢,其实就是sqoop它会近似于执行这个命令 select max(grade),mi
sqoop 命令行参数-m和--split-by的用法以及注意事项(有大坑!)
![](https://img-home.csdnimg.cn/images/20240711042549.png)