SQOOP中--split-by和--boundary-query有什么区别?

时间:2016-11-28 06:05:00

标签: split sqoop boundary

假设我们没有一个值平均分配的列,请说我们有这样的命令:

var name = 'Peter';
    db.User.find({name:{
                         $regex: new RegExp(name, "ig")
                     }
                },function(err, doc) {
                                     //Your code here...
              });

在这里使用--boundary-query这一点是什么,而--split-by做同样的事情? 有没有其他方法可以使用--boundary-query? 或者在没有密钥(唯一)列时更有效地分割数据的任何其他方法?

4 个答案:

答案 0 :(得分:9)

--split-by id会根据地图集(默认为4)的数量将您的数据统一分开。

现在默认情况下边界查询是这样的。

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

但如果您知道id val1开始,而 val2结尾。然后没有必要计算min()max()操作。这将使sqoop命令执行更快。

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

修改

现在(1.4.7)sqoop无法指定不均匀的分区进行拆分。

例如,您有以下数据:

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

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

然后它将它分成4个部分:

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

是的,在第3个映射器(101-150)中,RDBMS表中将 nothing

但是没有办法定义自定义分区,如:

1-10
51-60
190-200

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

答案 1 :(得分:0)

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

<强> - 边界查询 在sqoop导入过程中,它使用此查询来计算创建拆分的边界:从table_name中选择min(),max()。

在某些情况下,此查询不是最佳查询,因此您可以指定任何查询 任意查询使用--boundary-query参数返回两个数字列。 这样可以节省min(拆分)和max(拆分)操作,从而提高效率。

答案 2 :(得分:0)

我没有从答案中读到我期待的内容。

<强> - 分裂由

我想说 - 当你有一张没有主键的表时,主要使用--split-by,如果表没有主键,sqoop通常会吐出错误信息。 --split-by用于确定用于计算min()&amp;的另一列。在没有pk的情况下最大。一些要求是:

  • 表格应具有数值
  • 表不应包含null

出于性能原因,仅在索引列上使用--split-by。如果你必须从多个表中导入数据,自然很难检查所有这些表,看看哪些表有主键,哪些没有主键。这里,你使用--autoreset-to-one-mapper与-m #of_mappers一起使用的映射器。所以你的命令看起来像这样:

int r = randInt(1,50);
        jButton1.setText(Integer.toString(r));

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

<强> - 边界查询

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

答案 3 :(得分:0)

-分割 当表中有主键时,我们主要对表使用split by,但是如果没有主键,则使用--split-by,我们给出命令来分配数值数据/行。命令行如下

img

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