【问题标题】:sqoop to import data to hivesqoop 将数据导入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”。

我做错了什么?

【问题讨论】:

    标签: hadoop hive sqoop sqoop2 sql-manager


    【解决方案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'.
      猜你喜欢
      • 2019-07-12
      • 2016-03-17
      • 2016-08-07
      • 2017-02-03
      • 1970-01-01
      • 2023-03-13
      • 2021-02-27
      • 2018-05-20
      • 1970-01-01
      相关资源
      最近更新 更多