首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQOOP中的--split-by和--boundary query有什么不同?

SQOOP中的--split-by和--boundary query有什么不同?
EN

Stack Overflow用户
提问于 2016-11-28 14:05:00
回答 4查看 20.9K关注 0票数 5

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

代码语言:javascript
复制
sqoop import \
...
--boundary-query "SELECT min(id), max(id) from some_table"
--split-by id
...

当--split-by做同样的事情时,在这里使用--boundary-query有什么意义呢?有没有其他使用--boundary-query的方法?或者当没有键(唯一)列时更有效地拆分数据的任何其他方法?

EN

回答 4

Stack Overflow用户

发布于 2016-11-28 20:50:01

--split-by id将根据映射器的数量(默认为4)统一拆分您的数据。

现在,默认的边界查询是这样的。

代码语言:javascript
复制
--boundary-query "SELECT min(id), max(id) from some_table"

但是,如果你知道id val1开始, val2结束。那么计算min()max()操作就没有意义了。这将使sqoop命令执行得更快。

您可以指定任何返回val1val2的任意查询。

编辑:

现在(1.4.7)在sqoop中没有办法为拆分指定不均匀的分区。

例如,您有如下数据:

代码语言:javascript
复制
1,2,3,51,52,191,192,193,194,195,196,197,198,199,200

如果在命令中定义了4个映射器。它将检查min和max,在我们的例子中是1和200。

然后它会把它分成4个部分:

代码语言:javascript
复制
1-50
51-100
101-150
151-200

是的,在这第三个映射器(101-150)中,将从关系型数据库管理系统表中获取nothing

但是没有办法像这样定义自定义分区:

代码语言:javascript
复制
1-10
51-60
190-200

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

票数 13
EN

Stack Overflow用户

发布于 2018-02-03 19:40:36

--split-by对于自由格式查询导入,需要指定'split-by‘。当您导入任何特定查询的结果时,sqoop需要知道它将用来创建拆分的列名。然而,在导入表时,如果未指定,它将使用要导入的表的主键来创建拆分。如果您的主键不均匀且不一致,您还可以使用split-by指定任何其他列。

--boundary-query在sqoop导入过程中,它使用以下查询来计算创建拆分的边界: select min(),max() from table_name。

在某些情况下,该查询并不是最优的,因此您可以使用--boundary query参数指定任何返回两个数值列的任意查询。这节省了min(拆分)和max(拆分)操作,因此效率更高。

票数 1
EN

Stack Overflow用户

发布于 2018-06-11 07:10:56

我没有从答案中读到我所期望的。

--按拆分

我要说的是--split-by主要用于没有主键的表,如果表没有主键,sqoop通常会发出错误消息。--split-by用于确定在没有主键的情况下用于计算min()和max的另一列。以下是一些要求:

  • 表应包含数值
  • 表不应包含空null

出于性能原因,仅在索引列上使用--split-by。如果您必须从多个表导入数据,那么很难检查所有这些表来查看哪些表具有主键,哪些表没有主键,您可以将-- keys.Here - to -one映射器与-m #of_mappers中使用的映射器一起使用。因此,您的命令将如下所示:

代码语言:javascript
复制
sqoop-import --connect jdbc:mysql://localhost/dbName --table sometable --username uname --warehouse-dir whdir --autoreset-to-one-mapper -m 5

不包含主键的表将使用一个线程(按顺序),而具有主键的表将使用指定的5个线程或映射器。您不能在一个命令中同时使用--autoreset-to- one -mapper和-split-by。

--boundary-queries

如果你知道表上的最小值和值,你可以放弃复杂的默认计算来获得它们,你可以简单地将它们硬编码为边界查询的参数。@burakongun很好地解释了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40838036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档