sqoop中的以下命令是什么?

时间:2013-07-29 11:58:22

标签: sqoop

有人能告诉我在sqoop中使用--split-by和boundary查询有什么用?

  

sqoop import --connect jdbc:mysql:// localhost / my --username user --password 1234 --query'select * from table where id = 5 AND $ CONDITIONS'--split-by table.id - -target-dir / dir

5 个答案:

答案 0 :(得分:35)

- 拆分:用于指定用于生成导入拆分的表的列。这意味着它指定在将数据导入群集时将使用哪个列来创建拆分。它可以通过实现更大的并行性来增强导入性能。 Sqoop根据表的特定列中的值创建拆分,该列由用户通过import命令由--split-by指定。如果它不可用,则使用输入表的主键创建拆分。

使用原因:有时主键在最小值和最大值之间没有均匀的值分布(如果--split-by不可用,则用于创建拆分)。在这种情况下,您可以指定其他具有适当数据分布的列,以便为高效导入创建拆分。

- boundary-query:默认情况下,sqoop将使用查询选择min(),中的max()来查找创建拆分的边界。在某些情况下,此查询不是最优的,因此您可以使用--boundary-query参数指定任意返回两个数字列的任意查询。

使用理由:如果--split-by没有为您提供最佳性能,您可以使用它来进一步提高性能。

答案 1 :(得分:20)

- split-by 用于统一分配映射表中的值,即说你有100个唯一记录(主键),如果有4个映射器, - split-by (主键列)将有助于在映射器之间均匀地分配数据集。

Sqoop进程使用

$ CONDITIONS ,它将在内部用唯一的条件表达式替换以获取数据集。 如果运行并行导入,则map任务将使用$ CONDITIONS中替换的不同值执行查询。例如,一个映射器可以执行“从foo WHERE(id> = 0 AND id< 10000)”中选择bla,并且下一个映射器可以执行“从foo WHERE中选择bla(id> = 10000 AND id< 20000) “等等。

答案 2 :(得分:12)

Sqoop允许您并行导入数据,而--split-by和--boundary-query允许您进行更多控制。如果您只是导入一个表,那么它将使用PRIMARY KEY,但是如果您正在进行更高级的查询,则需要指定该列以进行并行拆分。

即,

  sqoop import \
    --connect 'jdbc:mysql://.../...' \
    --direct \
    --username uname --password pword \
    --hive-import \
    --hive-table query_import \
    --boundary-query 'SELECT 0, MAX(id) FROM a' \
    --query 'SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND $CONDITIONS'\
    --num-mappers 3
    --split-by a.id \
    --target-dir /data/import \
    --verbose

边界查询允许您指定优化查询以获取最大值,最小值。否则它会尝试在你的--query语句中执行MIN(a.id),MAX(a.id)。

结果将是(如果min = 0,max = 30)是3个并行运行的查询:

SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 0 AND 10;
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 11 AND 20;
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 21 AND 30;

答案 3 :(得分:1)

另外,如果我们在双引号内指定--query值(""),我们需要在$CONDITIONS之前加slash(\)

--query "select * from table where id=5 AND \$CONDITIONS"

或者

--query 'select * from table where id=5 AND $CONDITIONS' 

答案 4 :(得分:1)

拆分者:

  1. 为什么使用它? ->在从rdbms到hadoop提取数据的同时提高速度
  2. 它是如何工作的? ->默认情况下,sqoop中有4个映射器,因此导入是并行进行的。整个数据分为相等的分区。 Sqoop认为主键列用于拆分数据,然后从中找出最大和最小范围,然后使4个映射器的4个范围起作用。 例如,主键列中有1000条记录,最大值= 1000,最小值-0,因此sqoop将创建4个范围-(0-250),(250-500),(500-750), (750-1000),根据列的值,数据将被分区并分配给4个映射器,以将其存储在HDFS上。 因此,如果主键列分布不均匀,则通过分割方式,您可以更改列名称以进行均匀分区。

简而言之: 用于数据分区以支持并行性并提高性能

相关问题