-split by和--boundary查询的区别是什么?

dba5bblo  于 2021-06-03  发布在  Sqoop
关注(0)|答案(4)|浏览(506)

假设我们没有一个值均匀分布的列,假设我们有这样一个命令:

sqoop import \
...
--boundary-query "SELECT min(id), max(id) from some_table"
--split-by id
...

使用--boundary查询,而--split by做同样的事情有什么意义?有没有其他方法可以使用--边界查询?或者在没有键(唯一)列的情况下使用其他方法更有效地分割数据?

oyjwcjzk

oyjwcjzk1#

--split by当表中有主键时,我们主要对表使用split by,但是如果没有主键,那么通过使用--split by,我们会发出命令来分发数字数据/行。命令行如下

--sqoop import --connect jdbc:mysql://localhost:3306/database --username user --password pass --table tablename --target-dir dirname --delete-target-dir<if present already> --split-by column_name

--边界查询如果您知道表中的最小值和最大值,那么它将计算boudary来创建拆分

t3psigkw

t3psigkw2#

--split-by id 将根据Map器的数量统一分割数据(默认值为4)。
现在,默认情况下边界查询是这样的。

--boundary-query "SELECT min(id), max(id) from some_table"

但如果你知道 id 开始于 val1 结束于 val2 . 那就没必要计算了 min() 以及 max() 操作。这将使sqoop命令执行更快。
可以指定任何返回的任意查询 val1 以及 val2 .
编辑:
现在(1.4.7)在sqoop中没有办法指定用于分割的不均匀分区。
例如,您有如下数据:

1,2,3,51,52,191,192,193,194,195,196,197,198,199,200

如果在命令中定义了4个Map器。它将检查最小值和最大值,在我们的例子中是1和200。
然后它会把它分成4部分:

1-50
51-100
101-150
151-200

是的,在第3个Map器(101-150)中,rdbms表中没有任何内容。
但是没有办法像这样定义自定义分区:

1-10
51-60
190-200

对于大数据(数十亿行),实际上不适合这样查找精确的值,也不适合使用其他工具先查找数据模式,然后准备自定义分区。

jaql4c8m

jaql4c8m3#

--拆分方式对于自由格式查询导入,需要指定“拆分方式”。当您导入任何特定查询的结果时,sqoop需要知道它将使用哪个列名创建拆分。然而,在导入表时,如果未指定,它将使用要导入的表的主键来创建拆分。如果主键不均匀且不一致,也可以使用split by指定任何其他列。
--边界查询在sqoop导入过程中,它使用此查询来计算用于创建拆分的边界:从表名称中选择min(),max()。
在某些情况下,此查询不是最佳查询,因此可以使用--boundary查询参数指定任何返回两个数值列的任意查询。这节省了min(split by)和max(split by)操作,因此效率更高。

chhkpiq4

chhkpiq44#

我没有从答案中读出我所期望的。
--拆分依据:
我想说——split by主要用于没有主键的表,如果表没有主键,sqoop通常会抛出一条错误消息--split by用于确定在没有pk的情况下用于计算min()&max的另一列。一些要求是:
表应该有数值
表不应包含null

出于性能原因,仅在索引列上使用--split by。如果必须从多个表中导入数据,那么很难检查所有这些表,以确定哪些表有主键,哪些表没有主键。在这里,使用--autoreset将Map器与-m#of#mappers一起使用。所以你的命令如下:

sqoop-import --connect jdbc:mysql://localhost/dbName --table sometable --username uname --warehouse-dir whdir --autoreset-to-one-mapper -m 5

不包含主键的表将使用一个线程(按顺序),而包含主键的表将使用指定的5个线程或Map器。不能在一个命令中同时使用--autoreset to one mapper和-split by。
--边界查询:
如果您知道一个表上的最小值和值,您可以放弃复杂的默认计算来获得它们,您可以简单地将它们硬编码为边界查询的参数@burakongun对此解释得很好。

相关问题