【问题标题】:Sqoop import without primary key in RDBMS在 RDBMS 中没有主键的 Sqoop 导入
【发布时间】:2015-03-19 06:34:01
【问题描述】:

我可以使用 sqoop 将 RDBMS 表数据(表没有主键)导入到 hive 吗?如果是的话,请给sqoop导入命令。

我尝试过使用 sqoop import general 命令,但失败了。

【问题讨论】:

    标签: import sqoop


    【解决方案1】:

    如果您的表没有定义主键,那么您必须提供 -m 1 选项来导入数据,或者您必须提供带有某些列名的 --split-by 参数,否则会出现错误:

    ERROR tool.ImportTool: Error during import: No primary key could be found for table <table_name>. Please specify one with --split-by or perform a sequential import with '-m 1'
    

    那么你的 sqoop 命令看起来像

    sqoop import \
        --connect jdbc:mysql://localhost/test_db \
        --username root \
        --password **** \
        --table user \
        --target-dir /user/root/user_data \
        --columns "first_name, last_name, created_date"
        -m 1
    

    sqoop import \
        --connect jdbc:mysql://localhost/test_db \
        --username root \
        --password **** \
        --table user \
        --target-dir /user/root/user_data \
        --columns "first_name, last_name, created_date"
        --split-by created_date
    

    【讨论】:

      【解决方案2】:

      您可以在没有 Primarykey 的情况下将数据从 RDBMS 导入 hive。

      首先你需要在hive中创建一个表,然后你需要编写如下代码:

      sqoop import \
          --connect jdbc:mysql://localhost/test_db \
          --username root \
          --password **** \
          --table <RDBMS-Table-name> \
          --target-dir /user/root/user_data \
          --hive-import \ 
          --hive-table <hive-table-name> \
          --create-hive-table \
          -m 1 (or) --split-by <RDBMS-Column>
      

      【讨论】:

        【解决方案3】:

        在使用 1 Mapper 的第一个场景中...如果文件的大小非常大,此过程将需要更多时间来响应或可能会失败。在使用 mapper = 1 之前检查数据的大小。

        【讨论】:

          【解决方案4】:

          快速浏览:

          Sqoop 作业失败,错误如下所示“导入时出错:找不到表的主键。请使用--split-by 指定一个或使用'-m 1' 执行顺序导入”

          说明: 通常,当您在内部执行 Sqoop 作业时,它会在表中搜索主键。如果没有主键,则 Sqoop 作业将失败并且错误如下所示“导入期间错误:找不到表的主键。请使用 --split-by 指定一个或使用 '-m 1 执行顺序导入’”。该建议描述了这种情况有两种替代方法。

          最好的方法是选项 2

          1. 将映射器的数量指定为 1(默认为 4)。因此,通过将映射器的数量指定为 1,该任务将是顺序的并且与单线程任务相同。仅当您以小表为目标时才会成功,如果您正在寻找大型导入,这将失败,因为任务往往会永远运行。

          2. 最好的方法是使用 split-by,您可以在索引列或手动拆分列的基础上指定映射器的数量(使用查询)。

          【讨论】:

            【解决方案5】:

            在您的命令中使用以下内容:

            --autoreset-to-one-mapper
            

            Import 如果表没有主键并且没有提供拆分列,则应该使用一个映射器。它不能与--split-by &lt;col&gt; 选项一起使用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-09-09
              • 2013-09-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多