当表在不同的架构中时,如何从 SQL Server 导入所有带有 sqoop 的表?

Posted

技术标签:

【中文标题】当表在不同的架构中时,如何从 SQL Server 导入所有带有 sqoop 的表?【英文标题】:How to import all tables with sqoop from SQL Server when tables are in different schemas? 【发布时间】:2015-09-13 12:08:02 【问题描述】:

当我尝试使用 sqoop 从 hive 中的 SQL Server 导入所有表时,它可以工作,但仅当表处于默认模式 (dbo) 时。

当表在不同的架构中(并且有多个架构)时,导入失败并出现错误:

 15/09/12 16:47:50 ERROR manager.SqlManager: Error executing statement: com.microsoft.sqlserver.jdbc.SQLServerException:
Invalid object name 'Carveout'.
 com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'Carveout'.
         at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
         at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
         at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)
         at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
         at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
         at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
         at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
         at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
         at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:285)
         at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:674)
         at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:683)
         at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:240)
         at org.apache.sqoop.manager.SqlManager.getColumnTypes(SqlManager.java:223)
         at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:347)
         at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1277)
         at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1089)
         at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:96)
         at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:396)
         at org.apache.sqoop.tool.ImportAllTablesTool.run(ImportAllTablesTool.java:105)
         at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
         at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
         at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
         at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
         at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
         at org.apache.sqoop.Sqoop.main(Sqoop.java:238)

【问题讨论】:

【参考方案1】:

您可以导入特定模式的所有表。

最后尝试--schema schemaName。

如果您正在创建工作,我无法保证这一点。

【讨论】:

但我有多个表和多个模式 您可以在一个文件中将所有表与各自的架构一个接一个地列出,读取文件并使用Sqoop API方法一一摄取所有表。这样,您可以在一次执行中摄取所有表数据。【参考方案2】:

您可以在 sqoop 导入时将表列表作为 schemaname.dbo.tablename..iterate 传递并在 --query select *from schemaname.dbo.tablename 中使用它

【讨论】:

以上是关于当表在不同的架构中时,如何从 SQL Server 导入所有带有 sqoop 的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定我的表在 sql server 中已更新

临时表在哪里存储在 sql server 中?

当表名包含“'”时为 Sql Server 2008 构建动态查询

具有不同所有者的 SQL Server 所有权链跨架构,用于从多个架构中选择视图

如何从 SQL Server 或 Tableau Desktop 加载临时表?

当数据在 SQL Server 中时,如何通过 ADO 在 Access 中创建报表?