在RDBMS中没有主键的Sqoop导入

问题描述 投票:7回答:5

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

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

import sqoop
5个回答
18
投票

如果您的表没有定义主键,那么您必须为导入数据提供-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

3
投票

您可以在没有主键的情况下将数据从RDBMS导入到配置单元。

首先,您需要在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>

2
投票

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


1
投票

快速浏览:

Sqoop作业失败,错误看起来像这样“导入时出错:找不到表的主键。请指定一个用--split-by或用'-m 1'执行顺序导入”

描述:通常,当您在内部执行Sqoop作业时,它会在表中搜索主键。如果没有主键,则Sqoop作业失败,错误看起来像“导入时出错:找不到表的主键。请指定一个用--split-by或用'-m 1执行顺序导入'“。该建议描述了此方案有两种替代方法。

最好的方法是选项2

  1. 将映射器的数量指定为1(默认值为4)。因此,通过将映射器的数量指定为1,任务将是顺序的,并且与单个线程任务相同。只有当您要查找大型表时才会成功,如果您正在寻找大型导入,这将失败,因为任务往往会永远运行。
  2. 最好的方法是使用拆分,您可以在索引列的基础上指定映射器的数量或手动拆分列(使用查询)。

0
投票

在命令中使用以下命令:

--autoreset-to-one-mapper

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

© www.soinside.com 2019 - 2024. All rights reserved.