并行拉取配置说明
在数据源加速刷新时,可以开启并行拉取来加速大表抽取。需要配置两个参数:分批字段和分批数量。
参数含义
-
分批字段(
**partitionColumn**):按哪一列把数据切开。填列名即可,推荐选带索引的数值或日期列(如主键id、创建时间create_time)。 -
分批数量(
**numPartitions**):把表切成几份并行拉取,也就是并发度。填4表示 4 个线程同时拉,不是每批 4 条数据。
配置示例
拉取订单表 orders(id 范围 1 ~ 1,000,000):
-
分批字段 =
id -
分批数量 =
4
系统会自动切成 4 条 SQL 并发执行:
| 分区 | SQL |
|---|---|
| 1 | SELECT * FROM orders WHERE id >= 1 AND id < 250001 |
| 2 | SELECT * FROM orders WHERE id >= 250001 AND id < 500001 |
| 3 | SELECT * FROM orders WHERE id >= 500001 AND id < 750001 |
| 4 | SELECT * FROM orders WHERE id >= 750001 AND id <= 1000000 |
每条拉 25 万行,最后合并返回。
分批字段支持的类型
只支持数值和日期两大类:
| 类别 | 支持的类型 |
|---|---|
| 数值 | INTEGER、BIGINT、FLOAT、DOUBLE、DECIMAL |
| 日期 | DATE、TIMESTAMP |
为什么不支持文本(text/varchar)
Spark 按范围切分需要字段「能排序、能定上下界、能下推」,文本三样都不稳:
-
字典序 ≠ 业务序:
'10' < '2'、'2024-1-1' < '2024-10-1',切出来的批次数据分布不可控 -
无法确定上下界:Spark 拿不到有意义的 min/max,算不出均匀的切片边界
-
谓词下推失效:text 上的 range 条件在源端走不动索引,分批反而比不分批更慢
如果客户表字段全是 text 怎么办
按成本从低到高:
-
找事实上的时序字段:text 里有没有
'2024-04-21 10:30:00'这种规整内容 → 有就用派生列/视图CAST成 TIMESTAMP 再做分批字段 -
入仓 ETL 洗一道:加工链路里把关键列转成正确类型
-
都不行就别做增量:走全量覆盖,或按物理分区粒度刷新
-
根本解法:上 CDC(binlog / Debezium),绕开基于字段范围的切分
⚠️ 不要直接改 DWS 元数据里的类型标注——数据本身还是 text,Spark 执行时按字符串比较,结果会静默错数。要改就改数据本身(派生列 / 视图 / ETL),不要只改标注。