如何使用 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_Global
Business_Unit_Identifier
【讨论】:
以上是关于如何使用 sqoop 导入支持带空格的列名?的主要内容,如果未能解决你的问题,请参考以下文章