首页 文章

sqoop中的以下命令是什么?

提问于
浏览
9

任何人都可以告诉我在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

5 回答

  • 31

    --split-by : 用于指定用于生成导入拆分的表的列 . 这意味着它指定在将数据导入群集时将使用哪个列来创建拆分 . 它可用于通过实现更大的并行性来增强导入性能 . Sqoop根据表的特定列中的值创建拆分,该列由用户通过import命令由--split-by指定 . 如果它不可用,则使用输入表的主键来创建拆分 .

    Reason to use : 有时主键在最小值和最大值之间没有均匀的值分布(如果--split-by不可用,则用于创建分割) . 在这种情况下,您可以指定其他具有适当数据分布的列,以便为高效导入创建拆分 .

    --boundary-query : 默认情况下,sqoop将使用查询 select min(), max() from 来查找创建拆分的边界 . 在某些情况下,此查询不是最佳查询,因此您可以使用--boundary-query参数指定任意返回两个数字列的任意查询 .

    Reason to use : 如果--split-by没有为您提供最佳性能,您可以使用它来进一步提高性能 .

  • 18

    --split-by 用于统一分配映射表中的值,即说你有100个唯一记录(主键),如果有4个映射器, - split-by(主键列)将有助于均匀地分配数据集在 Map 集之间 .

    $CONDITIONS 由Sqoop进程使用,它将在内部用唯一的条件表达式替换以获取数据集 . 如果运行并行导入,则map任务将使用$ CONDITIONS中替换的不同值执行查询 . 例如,一个映射器可以执行"select bla from foo WHERE (id >=0 AND id < 10000)",并且下一个映射器可以执行"select bla from foo WHERE (id >= 10000 AND id < 20000)",依此类推 .

  • 1

    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
    

    边界查询允许您指定优化查询以获取最大值,最小值 . 否则它会尝试在你的--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;
    
  • 10

    另外,如果我们在双引号(" ")中指定 --query 值,我们需要在 $CONDITIONS 之前加上 slash(\)

    --query "select * from table where id=5 AND \$CONDITIONS"
    

    要不然

    --query 'select * from table where id=5 AND $CONDITIONS'
    
  • 0

    Split by :

    • 为何使用它? - >在从rdbms获取数据到hadoop时提高速度

    • 它是如何工作的? - >默认情况下,sqoop中有4个映射器,因此导入工作并行 . 整个数据被分成相等的分区 . Sqoop认为主键列用于拆分数据,然后从中找出最大和最小范围,然后使4个映射器的4个范围起作用 . Eg. 主键列中有1000条记录,最大值= 1000,最小值为-0所以sqoop将创建4个范围 - (0-250),(250-500),(500-750),(750-1000)并依赖于列的值将被分区并分配给4个映射器以将其存储在HDFS上 . 因此,如果主键列不是均匀分布的,那么使用拆分可以更改列名以进行均匀分区 .

    In short: 用于分区数据以支持并行性并提高性能

相关问题