谁能告诉我 --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-目录/目录
谁能告诉我 --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-目录/目录
--split-by :用于指定用于生成导入拆分的表的列。这意味着它指定在将数据导入集群时将使用哪个列来创建拆分。它可用于通过实现更大的并行度来提高导入性能。Sqoop 根据用户通过 import 命令由 --split-by 指定的表的特定列中的值创建拆分。如果不可用,则使用输入表的主键来创建拆分。
使用理由:有时主键在最小值和最大值之间没有均匀的分布(如果 --split-by 不可用,则用于创建拆分)。在这种情况下,您可以指定其他具有适当数据分布的列来创建拆分以实现高效导入。
--boundary-query :默认情况下,sqoop 将使用 query select min(), max() from来找出创建拆分的边界。在某些情况下,此查询不是最佳查询,因此您可以使用 --boundary-query 参数指定返回两个数字列的任意查询。
使用理由:如果 --split-by 没有为您提供最佳性能,您可以使用它来进一步提高性能。
--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)”等等.
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;
拆分方式:
简而言之: 用于数据分区以支持并行性并提高性能
此外,如果我们--query
在双引号(“”)中指定值,我们需要在前面$CONDITIONS
加上一个slash(\)
--query "select * from table where id=5 AND \$CONDITIONS"
要不然
--query 'select * from table where id=5 AND $CONDITIONS'