0

当我尝试从 Teradata View 导入表时,我遇到了 Sqoop 的 Teradata 连接器问题。我只能访问视图。

但不知何故,当 sqoop 作业开始时,它试图在我正在访问但无权在该数据库/模式中创建任何表的 Teradata DB 中创建一个表

我低于错误

 13/05/31 03:40:12 ERROR tool.ImportTool: Encountered IOException running import job:     com.teradata.hadoop.exception.TeradataHadoopSQLException: com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata Database] [TeraJDBC 14.00.00.01] [Error 3524] [SQLState 42000] The user does not have CREATE TABLE access to database EDWABSVIEWS.
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDatabaseSQLException(ErrorFactory.java:307)
    at com.teradata.jdbc.jdbc_4.statemachine.ReceiveInitSubState.action(ReceiveInitSubState.java:102)
    at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.subStateMachine(StatementReceiveState.java:298)
    at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.action(StatementReceiveState.java:179)
    at com.teradata.jdbc.jdbc_4.statemachine.StatementController.runBody(StatementController.java:120)
    at com.teradata.jdbc.jdbc_4.statemachine.StatementController.run(StatementController.java:111)
    at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:372)
    at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:314)
    at com.teradata.jdbc.jdbc_4.TDStatement.doNonPrepExecute(TDStatement.java:277)
    at com.teradata.jdbc.jdbc_4.TDStatement.execute(TDStatement.java:1087)
    at com.teradata.hadoop.TeradataConnection.executeDDL(TeradataConnection.java:379)
    at com.teradata.hadoop.TeradataConnection.createTable(TeradataConnection.java:1655)
    at com.teradata.hadoop.TeradataPartitionStageInputProcessor.createStageTable(TeradataPartitionStageInputProcessor.java:233)
    at com.teradata.hadoop.TeradataPartitionStageInputProcessor.setup(TeradataPartitionStageInputProcessor.java:87)
    at com.teradata.hadoop.TeradataImportJob.run(TeradataImportJob.java:36)
    at org.apache.sqoop.teradata.TeradataImportJob.doSubmitJob(TeradataImportJob.java:173)
    at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:141)
    at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:208)
    at org.apache.sqoop.teradata.TeradataConnManager.importTable(TeradataConnManager.java:64)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:403)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:476)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    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)

    at    com.teradata.hadoop.TeradataPartitionStageInputProcessor.createStageTable(TeradataPartitionStageInputProcessor.java:243)
    at com.teradata.hadoop.TeradataPartitionStageInputProcessor.setup(TeradataPartitionStageInputProcessor.java:87)
    at com.teradata.hadoop.TeradataImportJob.run(TeradataImportJob.java:36)
    at org.apache.sqoop.teradata.TeradataImportJob.doSubmitJob(TeradataImportJob.java:173)
    at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:141)
    at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:208)
    at     org.apache.sqoop.teradata.TeradataConnManager.importTable(TeradataConnManager.java:64)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:403)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:476)
    at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    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)

请协助。

4

3 回答 3

2

如果您已指定split.by.partition方法并且您的表未分区,或者如果您启用--staging-force了 ,则 TeraData 连接器将默认在连接 URL 中的指定数据库中创建一个阶段表。

从 Cloudera 文档:

如果您的输入表未分区,则连接器将创建分区临时表并执行 INSERT into SELECT 查询以将数据从源表移动到临时表中。随后,每个映射器从一个分区传输数据,从而产生一个 AMP 操作。使用单个 AMP,您可以使用大量映射器来获得最佳性能。可用的永久空间量必须与源表和执行 SELECT 查询所需的假脱机空间量一样大。如果您的表已经分区,则不会创建额外的临时表。但是,您可以强制连接器使用 --staging-force 参数重新分区数据以获得更好的性能。在不强制重新分区数据的情况下,此方法会打开所有 AMP 操作,因此您应该使用 20 到 30 个映射器。

要解决您必须避免暂存的问题,请切换到split.by.value或您可以为您有权访问的暂存表 ( )split.by.hash指定不同的数据库。--staging-databaseCREATE TABLE

此外,请考虑连接器将尝试在您有自由形式查询 ( --query) 和多个映射器时创建视图。要解决您指定并加载整个表的CREATE VIEW权限错误,您仍然可以指定哪些列 ( ) 和 WHERE 过滤器 ( ),或者您必须使用.--table <TABLE_NAME>--columns--where--num-mappers 1

我个人认为应该有一个属性来启用/禁用视图的创建。如果您正在执行导入数据工作流,则不需要创建视图和临时表。

于 2015-03-25T11:51:44.567 回答
2

Cloudera Connector for Teradata 1.1.1 不支持从视图导入,如用户指南的限制部分所述。

连接器将尝试创建临时表以提供全有或全无语义,我期望这是异常的原因。如果您在主数据库上没有此类权限,您可以指示连接器在您拥有足够权限的任何其他数据库中创建临时表。请查看用户指南以获取更多说明。

于 2013-06-02T13:32:03.997 回答
1

当我尝试将--split-by参数与自由格式查询--query参数一起使用时,我遇到了同样的错误。然后我替换--split-by--num-mappers 1, 以强制 SQOOP 在一个进程中运行它。然后那个错误就消失了。

我假设--split-by它将尝试创建单个映射器进程可能不会创建的临时文件/视图。

这是我正在使用的模板:

sqoop import \
--connect jdbc:teradata://<host>/Database=<dbname> \
--username <username> \
--password <password> \
--hive-import \
--hive-table <hivetablename> \
--hive-drop-import-delims \
--num-mappers 1 \
--target-dir <hdfspath> \
--query "<sqlquery> and \$CONDITIONS"
于 2014-12-25T19:50:33.000 回答