sqoop 将数据导入hive

Posted

技术标签:

【中文标题】sqoop 将数据导入hive【英文标题】:sqoop to import data to hive 【发布时间】:2016-08-25 09:58:33 【问题描述】:

我正在尝试使用 sqoop2 将数据导入配置单元表。我正在使用--hive-import,但它不起作用

代码:

sqoop import --connect jdbc:sqlserver://192.168.x.xxx:11xx --username user --password user --table xxxx.NOTIFICATION --hive-import

错误:

ERROR manager.SqlManager:执行语句出错:com.microsoft.sqlserver.jdbc.SQLServerException:无效的对象名称“XXXX.NOTIFICATION”。

我做错了什么?

【问题讨论】:

【参考方案1】:

以下观察基于 Sqoop 1.4.6

您在表名中使用了 .(点)。

在内部,Sqoop 将触发命令

SELECT t.* FROM xxxx.NOTIFICATION AS t WHERE 1=0

获取 SQL Server 表的元数据。

这个命令被解释为

xxxx - 恶名 通知 - 表名

为避免这种情况,您可以使用转义字符([ ],如果是 SQL Server):

sqoop import --connect jdbc:sqlserver://192.168.x.xxx:11xx --username user --password user --table [xxxx.NOTIFICATION] --hive-import

这会生成

SELECT t.* FROM [xxxx.NOTIFICATION] AS t WHERE 1=0

现在xxxx.NOTIFICATION 将被视为表名。

【讨论】:

xxxx.NOTIFICATION 是我的表名,我尝试在命令中使用--query,然后它就可以工作了。我不知道这里有什么问题 $ sqoop import --connect "jdbc:sqlserver://192.168.x.xxx:11xx;database=SSSS;username=user ;password=user " --query "SELECT * FROM XXXX.NOTIFICATION where \$CONDITIONS" --target-dir /user/cloudera/xxxxx -m 1 我试过了,我得到了ERROR manager.SqlManager: Error executing statement: com.microsoft.sqlserver.jdbc.SQLServerException: Unclosed quotation mark after the character string '[XXXX.NOTIFICATION] AS t WHERE 1=0'. @animal 尝试我的查询将--verbose 放在命令的末尾。分享完整的错误日志 好的,我会分享,但在我的--query 中我使用的是数据库名称,但在你的中我没有看到它【参考方案2】:

您好,经过一番研究并与@dev 讨论了这个问题后,我找到了解决方案。

我正在使用 sqoop2,所以我更改了命令并使用了以下命令,它对我有用。

$ sqoop import --connect "jdbc:sqlserver://192.168.x.xxx:11xx;database=SSSS;username=user;password=user" --query "SELECT * FROM xxxx.NOTIFICATION where \$CONDITIONS" --split-by xxxx.NOTIFICATION.ID --hive-import --hive-table NOTIFICATION  --target-dir NOTIFICATION 

在执行此命令之前,我们应该使用create 命令在 hive 中创建表。在这里,我创建了名为 NOTIFICATION 的配置单元表。

【讨论】:

【参考方案3】:

我假设表名是 NOTIFICATION 并且您在编写 --table xxxx.NOTIFICATION 时试图提及数据库名称 xxxx

如果是这种情况,您可以试试下面提到的语法吗?

sqoop import --connect jdbc:sqlserver://192.168.x.xxx:11xx;databaseName=xxxx --username user --password user --table NOTIFICATION --hive-import

【讨论】:

没有表名是xxxx.NOTIFICATION 不是NOTIFICATION @animal 你试过这个吗? sqoop import --connect 'jdbc:sqlserver://192.168.x.xxx:11xx;databaseName=SS‌​SS' --username user --password user --table xxxx\.NOTIFICATION --hive-import 是的,我用过它,我得到了ERROR manager.SqlManager: Error executing statement: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'xxxx.NOTIFICATION'.

以上是关于sqoop 将数据导入hive的主要内容,如果未能解决你的问题,请参考以下文章

sqoop mysql数据变化怎么导入

sqoop从mysql导入到hive中问题

sqoop抽取oracle数据至hive并建表

使用 sqoop 将mysql数据导入到hive(import)

Sqoop- sqoop将mysql数据表导入到hive报错(未解决)

linux中sqoop实现hive数据导入到mysql