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

Posted

技术标签:

【中文标题】如何使用 sqoop 导入支持带空格的列名?【英文标题】:How to support column names with spaces using sqoop import? 【发布时间】:2014-12-19 19:16:35 【问题描述】:

我们有一个 MSSQL DB 设置,列名分别为“Column 0”和“Column 1”:注意空格。

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

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

堆栈跟踪报告:

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

如果我们删除数据库和命令中的列名称空间,它会起作用。

我们如何让它支持在 --columns 参数中使用空格?如果专门使用 --query 并转义,我们能够成功地做到这一点的唯一方法。

例如,我们必须编写这样的查询:

选择 t.[第 1 列]

【问题讨论】:

你能试试--columns '`Column 0`'吗? 14/12/19 19:44:06 错误工具。ImportTool:导入失败:未找到列:`Column 0` 疯狂的建议;不要在列名中添加空格。看起来你的工具不喜欢它。 它是一个连接用户生成数据库的工具,我们无法控制它,需要支持它。 【参考方案1】:

从“sqoop import”这个名字看来,这个工具只是用来阅读的?

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

EXEC SP_RENAME SourceTable, SourceTable_

CREATE VIEW SourceTable
AS

SELECT [Column 0] as Column0
FROM SourceTable_

你可以这样写你的查询...

SELECT t.Column0
FROM SourceTable t

这充其量是最后的解决方法,如果应用程序尝试更新视图,它可能无法正常工作。

值得一试。

【讨论】:

【参考方案2】:

我昨天遇到了和你一样的问题(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

【讨论】:

【参考方案3】:

如果列名有空格,请使用 --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_GlobalBusiness_Unit_Identifier

【讨论】:

以上是关于如何使用 sqoop 导入支持带空格的列名?的主要内容,如果未能解决你的问题,请参考以下文章

如何利用sqoop将hive数据导入导出数据到mysql

如何高效地批量导入数据到SqlServer

如何高效地批量导入数据到SqlServer

在 RDBMS 中没有主键的 Sqoop 导入

使sqoop能够启用压缩的一些配置

从 SAP HANA 导入数据时出现 sqoop 问题