Sqoop - 数据分割

Aja*_*jay 2 hadoop sqoop

Sqoop能够使用--query子句从多个表中导入数据,但不清楚它是否能够在查询下导入.

从deptid的emp组中选择deptid,avg(薪水)

另一个问题是

sqoop import --connect jdbc:mysql:// myserver:1202/--username = u1 --password = p1 --query'从emp中选择*empid <1123和$ CONDITIONS'--split-by empid --target -dir/uname/emp/salary

$ CONDITIONS和split-by用于执行并行处理,或者我们可以说有效地导入数据.以前根据条件拆分行,然后在主键上使用最小和最大逻辑.这两者有什么区别($CONDITIONS, split-by).如果我们在同一个sqoop语句中使用两者,哪个子句会优先?

谢谢....

dev*_*v ツ 8

你的理解存在一些差距.

首先,并行度由-m <n>或控制--num-mappers <n>.默认值为--num-mappers4.

其次,--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列并使用查询查找其最大值最小值:

SELECT MIN(empId), MAX(empId) FROM (Select * From emp WHERE (1 = 1) ) t1

看到它被替换$CONDITIONS(1 = 1).

在我们的例子中,min,max值为1和100.

由于映射器数量为4,sqoop将我的查询分为4个部分.

使用下限'empId> = 1'和上限'empId <25'创建输入拆分

使用下限'empId> = 25'和上限'empId <50'创建输入拆分

使用下限'empId> = 50'和上限'empId <75'创建输入拆分

使用下限'empId> = 75'和上限'empId <= 100'创建输入拆分

现在$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查询.