你的理解有些差距。
首先,并行度由-m <n>或--num-mappers <n>控制。 --num-mappers 默认值为 4。
其次,--split-by <column-name>,将根据列名拆分您的任务。
第三,$CONDITIONS,是sqoop内部用来实现这个拆分任务的。
示例,您发起了一个查询:
sqoop import --connect jdbc:mysql://myserver:1202/ --username u1 --password p1 --query 'select * from emp where $CONDITIONS' --split-by empId --target-dir /temp/emp -m 4
比方说,我的 empId 是从 1-100 均匀分布的。
现在,sqoop 将获取 --split-by 列并使用查询找到它的 max 和 min 值:
SELECT MIN(empId), MAX(empId) FROM (Select * From emp WHERE (1 = 1) ) t1
看到它用(1 = 1) 替换了$CONDITIONS。
在我们的例子中,最小值、最大值是 1 和 100。
由于映射器的数量为 4,sqoop 会将我的查询分成 4 个部分。
使用下限“empId >= 1”和上限“empId
使用下限“empId >= 25”和上限“empId
使用下限“empId >= 50”和上限“empId
使用下限 'empId >= 75' 和上限 'empId
现在$CONDITIONS 将再次出现。它被上述范围查询所取代。
第一个映射器会像这样触发查询:
Select * From emp WHERE empId >= 25' AND 'empId < 50
其他 3 个映射器以此类推。
所有映射器的结果被聚合并写入最终的 HDFS 目录。
关于您的查询:
select deptid, avg(salary) from emp group by deptid
你会指定
--query 'select deptid, avg(salary) from emp group by deptid where $CONDITIONS'
会先转换成
select deptid, avg(salary) from emp group by deptid where (1 = 0)
获取列元数据。
我相信这个查询不会在 RDBMS 中运行。直接在 Mysql 中尝试上述查询(有Where (1 = 0))。
因此,您将无法使用此查询来使用 Sqoop 获取数据。
Sqoop 用于更简单的 SQL 查询。