Sqoop能够使用--query子句从多个表导入数据,但不清楚它是否能够导入下面的查询。
按部门从emp组中选择deptid、avg(薪资)
另一个问题是
sqoop导入--连接jdbc:mysql://myserver:1202/ -username=u1--密码=p1--查询‘empid< 1123和$CONDITIONS’从emp中选择*-按empid拆分-目标-dir/uname/emp/$CONDITIONS
$CONDITIONS和拆分是用来执行并行处理的,或者可以说是高效地导入数据。前者根据条件拆分行,然后在主键上使用min和max逻辑。这两种($CONDITIONS, split-by)的区别是什么?如果在同一个sqoop语句中同时使用这两种语句,那么哪个子句将获得优先级?
谢谢..。
发布于 2016-05-05 10:38:00
你的理解上有一些差距。
首先,并行度由-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
将$CONDITIONS替换为(1 = 1)。
在我们的例子中,min,最大值是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查询.
发布于 2016-11-25 12:05:22
您的查询“Select* from emp where empid< 1123和$CONDITIONS”可以很好地将数据从关系数据库导入到HDFS。
即使$CONDITIONS首先在where子句中计算为1=0,但如果您在控制台上看到Sqoop导入日志,实际上将看到另一个SQL边界查询,它将用1=1替换$CONDITIONS,后者将传递查询,因此可以导入数据。
请注意,Sqoop甚至可以导入中等复杂的SQL查询,如联接。我不确定它是否能够支持高度复杂的SQL查询,尽管我还没有亲自测试它。
https://stackoverflow.com/questions/37042357
复制相似问题