你们的理解有些差距。
首先,并行度由-m <n>
or --num-mappers <n>
。默认值为--num-mappers
is 4.
Second, --split-by <column-name>
,将根据列名称拆分您的任务。
Third, $CONDITIONS
,sqoop内部使用它来实现这个分割任务。
Example,您发起了一个查询:
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 and min使用查询的值:
SELECT MIN(empId), MAX(empId) FROM (Select * From emp WHERE (1 = 1) ) t1
看到替换了$CONDITIONS
with (1 = 1)
.
在我们的例子中,最小值、最大值分别为 1 和 100。
由于映射器的数量为 4,sqoop 会将我的查询分为 4 部分。
创建下限“empId >= 1”和上限“empId
创建下限“empId >= 25”和上限“empId
创建下限“empId >= 50”和上限“empId
创建下限“empId >= 75”和上限“empId
Now $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 中运行。尝试上面的查询(having Where (1 = 0)
)直接在Mysql中。
因此,您将无法使用此查询来使用 Sqoop 获取数据。
Sqoop 用于更简单的 SQL 查询。