14

谁能告诉我 --split-by 和边界查询在 sqoop 中有什么用?

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-目录/目录

4

5 回答 5

43

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

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

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

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

于 2013-07-30T08:35:52.513 回答
23

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

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

于 2013-07-30T13:31:17.037 回答
14

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

IE,

  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;
于 2013-07-29T13:43:58.853 回答
5

拆分方式:

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

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

于 2018-11-06T07:09:46.117 回答
2

此外,如果我们--query在双引号(“”)中指定值,我们需要在前面$CONDITIONS加上一个slash(\)

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

要不然

--query 'select * from table where id=5 AND $CONDITIONS' 
于 2015-08-17T07:40:08.433 回答