如果主键存在的话就默认使用主键作为拆分列
如果主键的实际值在其范围内不均匀分布,则可能导致任务不平衡。您应该使用–split-by参数显式选择不同的列
Sqoop目前无法拆分多列索引。如果表没有索引列,或者具有多列键,则还必须手动选择拆分列。
–split-by对非数字类型的字段支持不好,会导致无法切分任务。一般用于主键及数字类型的字段
split-by 根据不同的参数类型有不同的切分方法,如int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域
当int的范围特别小的时候,最后一个mapper会有一定倾斜
split key 要求 非空
- sqoop mysql -> hive 当指定 split key 为 varchar类型时会遇到的情况
现象
1、任务无法切分,数据倾斜造成速度慢或者内存溢出
2、split key 字段存在空值时会丢失数据
目前想到的解决办法是:将-m 设置称1,split-by不设置,即只有一个map运行,缺点是不能并行map录入数据。(注意,当-m 设置的值大于1时,split-by必须设置字段)
split key 支持的好的有一下数据类型
BigDecimal,Boolean,Date,Float,Integer
BigDecimalSplitter.java
BooleanSplitter.java
DBSplitter.java
DateSplitter.java
FloatSplitter.java
IntegerSplitter.java
OracleDateSplitter.java