如何使用sqoop import支持带空格的列名?

时间:2014-12-19 19:16:36

标签: java sql-server jdbc sqoop

我们有一个MSSQL数据库设置,列名为"列0和#34;和#34;第1列和第34列:注意空格。

如果我运行以下命令,则会出错:

sqoop import --driver net.sourceforge.jtds.jdbc.Driver --connect jdbc:jtds:sqlserver://somemssqldb.com/OurDB --table dbo.OurTableName --username username --password ourPassword --columns "第0列和第34列; --target-dir s3:// our-s3-bucket / 9 / data / 1262/141893327230246 -m 1

堆栈跟踪报告:

错误:java.io.IOException:nextKeyValue中的SQLException 引起:java.sql.SQLException:' 0'附近的语法不正确。

如果我们删除数据库和命令中的列名空格,它就可以工作。

我们怎样才能支持在--columns参数中使用空格?如果通过使用--query特定并且转义,我们成功地能够这样做的唯一方法。

例如,我们必须编写如下查询:

SELECT t。[第1栏]

3 个答案:

答案 0 :(得分:0)

从名称" sqoop import"听起来这个工具只用于阅读?

也许你可以尝试通过重命名表来混淆它,然后创建一个与表名相同的视图。在视图中,您可以为列添加别名而不用空格。

EXEC SP_RENAME SourceTable, SourceTable_

CREATE VIEW SourceTable
AS

SELECT [Column 0] as Column0
FROM SourceTable_

您可以像这样编写查询......

SELECT t.Column0
FROM SourceTable t

最好这是最后的解决方法,如果应用程序尝试更新视图,它可能无效。

值得一试。

答案 1 :(得分:0)

我刚遇到了与你昨天相同的问题(SQLserver上的输入表,Sqoop版本1.4.5),我发现解决问题的唯一方法就是使用'--query'语句。

但是,我没有必要“转义”列名,我使用'*'通配符映射所有列(这是我想要的行为:我只需要从SQLserver复制整个表)。 使用通配符的优点:它对于每个表都是通用的,所以我可以轻松地创建一个脚本来复制很多表。

例如,这是我使用的完整命令:

sqoop import --connect "jdbc:sqlserver://$sqlServer:1433; database=$origDatabase; username=$myUser; password=$myPassword" 
--hive-import --driver com.microsoft.sqlserver.jdbc.SQLServerDriver
 --hive-database $hiveDatabase --fields-terminated-by '\t' 
--null-string '' --null-non-string '' -m 1 --outdir $dirJavaGeneratedCode
 --query "select a.* from $origTable a where \$CONDITIONS"
 --target-dir /tmp/$myTable --hive-table $myTable >> $logFile 2>> $logFile

答案 2 :(得分:0)

如果列名称具有空格

,请使用--query选项

示例sqoop导入查询 sqoop import --driver“com.microsoft.sqlserver.jdbc.SQLServerDriver”--connect "jdbc:sqlserver://aaaaa;databaseName=bbbb" --username "userName" --password "PassWord" --target-dir "/target directory" --query 'Select * from dbo.PANHPE_PROD_LN_ID_BU_GRP WHERE $CONDITIONS' --fields-terminated-by \034 -m 1

在我的案例栏中名称:Manufacturing_Product_Global Business_Unit_Identifier