我们有一个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栏]
答案 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