我可以使用sqoop将RDBMS表数据(表没有主键)导入配置单元吗?如果是,那么请你给出sqoop import命令。
我尝试过sqoop import general命令,但失败了。
答案 0 :(得分: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
答案 1 :(得分:3)
您可以在没有Primarykey的情况下将数据从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 :(得分:2)
在使用1 Mapper的第一个场景中...如果文件的大小非常大,则此过程将花费更多时间来响应或可能失败。在使用mapper = 1之前检查数据的大小。
答案 3 :(得分:1)
快速查看:
说明: 通常,当您在内部执行Sqoop作业时,它会在表中搜索主键。如果没有主键,则Sqoop作业将失败,并且错误如下所示:“导入期间出现错误:找不到该表的主键。请使用--split-by指定一个,或者使用'-m 1执行顺序导入”。该建议描述了这种情况的两种替代方法。
最好的方法是选项2
要将映射器的数量指定为1(默认为4)。因此,通过将映射器的数量指定为1,该任务将是连续的,并且与单线程任务相同。仅当您以小型表为目标时,这种情况才会成功,以防万一,如果您正在寻找大型导入文件,由于任务倾向于永远运行,这将失败。
最好的方法是使用分割方式,您可以在索引列的基础上指定映射器的数量,也可以手动分割列(使用query)。
答案 4 :(得分:0)
在命令中使用以下内容:
--autoreset-to-one-mapper
如果表没有主键并且没有提供分隔列,则 Import
应该使用一个映射器。不能与--split-by <col>
选项一起使用。