在 RDBMS 中没有主键的 Sqoop 导入
Posted
技术标签:
【中文标题】在 RDBMS 中没有主键的 Sqoop 导入【英文标题】:Sqoop import without primary key in RDBMS 【发布时间】:2015-03-19 06:34:01 【问题描述】:我可以使用 sqoop 将 RDBMS 表数据(表没有主键)导入到 hive 吗?如果是的话,请给sqoop导入命令。
我尝试过使用 sqoop import general 命令,但失败了。
【问题讨论】:
【参考方案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(默认为 4)。因此,通过将映射器的数量指定为 1,该任务将是顺序的并且与单线程任务相同。仅当您以小表为目标时才会成功,如果您正在寻找大型导入,这将失败,因为任务往往会永远运行。
最好的方法是使用 split-by,您可以在索引列或手动拆分列的基础上指定映射器的数量(使用查询)。
【讨论】:
【参考方案5】:在您的命令中使用以下内容:
--autoreset-to-one-mapper
Import
如果表没有主键并且没有提供拆分列,则应该使用一个映射器。它不能与--split-by <col>
选项一起使用。
【讨论】:
以上是关于在 RDBMS 中没有主键的 Sqoop 导入的主要内容,如果未能解决你的问题,请参考以下文章
当少数表没有主键时,sqoop import-all 具有并行性