任何人都可以告诉我在sqoop中使用--split-by和boundary查询有什么用?
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- dir/dir
Tar*_*riq 37
--split-by:用于指定用于生成导入拆分的表的列.这意味着它指定在将数据导入群集时将使用哪个列来创建拆分.它可以通过实现更大的并行性来增强导入性能.Sqoop根据表的特定列中的值创建拆分,该列由用户通过import命令由--split-by指定.如果它不可用,则使用输入表的主键来创建拆分.
使用原因:有时主键在最小值和最大值之间没有均匀的值分布(如果--split-by不可用,则用于创建拆分).在这种情况下,您可以指定其他具有正确数据分布的列,以便为高效导入创建拆分.
--boundary-query:默认情况下,sqoop将使用查询select min(),max()from来查找创建拆分的边界.在某些情况下,此查询不是最优的,因此您可以使用--boundary-query参数指定任意返回两个数字列的任意查询.
使用原因:如果--split-by没有为您提供最佳性能,您可以使用它来进一步提高性能.
Muk*_*h S 21
--split-by用于统一分配映射表中的值,即说你有100个唯一记录(主键),如果有4个映射器, - split-by(主键列)将有助于分发你数据集在映射器之间均匀分布.
$ CONDITIONS由Sqoop进程使用,它将在内部用唯一的条件表达式替换以获取数据集.如果运行并行导入,则map任务将使用$ CONDITIONS中替换的不同值执行查询.例如,一个映射器可以执行"从foo WHERE中选择bla(id> = 0 AND id <10000)",并且下一个映射器可以执行"从foo WHERE中选择bla(id> = 10000 AND id <20000)"等等.
小智 12
Sqoop允许您并行导入数据,而--split-by和--boundary-query允许您进行更多控制.如果您只是导入一个表,那么它将使用PRIMARY KEY,但是如果您正在进行更高级的查询,则需要指定列来执行并行拆分.
即
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
Run Code Online (Sandbox Code Playgroud)
边界查询允许您指定优化查询以获取最大值,最小值.否则它会尝试在你的--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;
Run Code Online (Sandbox Code Playgroud)
分割依据:
简而言之: 用于数据分区以支持并行性并提高性能
| 归档时间: |
|
| 查看次数: |
47747 次 |
| 最近记录: |