假设我们没有一个值平均分配的列,请说我们有这样的命令:
var name = 'Peter';
db.User.find({name:{
$regex: new RegExp(name, "ig")
}
},function(err, doc) {
//Your code here...
});
在这里使用--boundary-query这一点是什么,而--split-by做同样的事情? 有没有其他方法可以使用--boundary-query? 或者在没有密钥(唯一)列时更有效地分割数据的任何其他方法?
答案 0 :(得分:9)
--split-by id
会根据地图集(默认为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个映射器。在我们的例子中,它将检查最小值和最大值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的情况下最大。一些要求是:
出于性能原因,仅在索引列上使用--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以创建拆分