Sqoop import导入含主键异常值的MySQL表时split size是多少
Sqoop导入场景分片大小计算结果
Sqoop默认用主键做分片列的时候,算分片大小根本不会扫全表的主键值,也不会管主键中间有没有断号、有没有离群值,逻辑非常直接:
- 第一步先跑两个聚合查询,带上你配置的where过滤条件,查出符合条件的主键最小值、主键最大值
- 第二步用
(最大值 - 最小值) / 并行任务数算单分片大小,并行任务数就是你-m参数传的值,没手动配置的话默认是4
套到这个场景里计算:
- 配置的where条件是
id < 20000,但表里实际存在的符合条件的id最小是1,最大就是那个离群值12000——20000只是写的过滤阈值,比表内实际存在的最大id大,根本不会成为分片的上界 - 按默认4并行度算,主键总跨度是12000 - 1 = 11999,算下来单分片大小约为3000,Sqoop对整数主键会自动取整对齐,最终四个分片大致是[1,3000]、[3001,6000]、[6001,9000]、[9001,12000]
有个细节要注意:10001到11999这个区间根本没有数据,所以最后一个分片实际要拉的数据只有id=10000和id=12000两条,数据量比其他分片小很多,但Sqoop的分片逻辑感知不到这种断档,还是只认min和max两个边界值算分片跨度。
内容的提问来源于stack exchange,提问作者SOWMYA GN
相关产品推荐
相关产品推荐

