Sqoop - 数据分割

2024-02-22

Sqoop 能够使用以下方式从多个表导入数据--query子句,但不清楚是否能够导入以下查询。

按部门号从员工组中选择部门号、平均工资

另一个问题是

sqoop import --connect jdbc:mysql://myserver:1202/ --username=u1 --password=p1 --query '从 emp 中选择 *,其中 empid

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

谢谢....


你们的理解有些差距。

首先,并行度由-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 查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sqoop - 数据分割 的相关文章

随机推荐