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语句中使用两者,哪个子句会优先?
谢谢....
你的理解存在一些差距.
首先,并行度由-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
列并使用查询查找其最大值和最小值:
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查询.
归档时间: |
|
查看次数: |
5872 次 |
最近记录: |