在尝试从teradata视图导入表时,我遇到了teradata connector for sqoop的问题。我只能查看。
但不知何故,当sqoop作业启动时,它正试图在teradata db中创建一个表,我正在访问该表,但无权在该db/schema中创建任何表
我在犯错误
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)
请帮忙。
3条答案
按热度按时间uhry853o1#
cloudera connector for teradata 1.1.1不支持从视图导入,如《用户指南》的“限制”部分所述。
连接器将尝试创建临时表,以便提供all或nothing语义,我认为这就是异常的原因。如果您在主数据库上没有这样的权限,则可以指示连接器在您有足够权限的任何其他数据库中创建临时表。请查看用户指南了解更多说明。
f87krz0w2#
当我尝试使用
--split-by
参数和自由形式查询--query
争论。然后我换了--split-by
与--num-mappers 1
,强制sqoop在一个进程中运行它。然后那个错误就消失了。我是这么想的
--split-by
将尝试在单个Map程序进程可能无法创建的位置创建临时文件/视图。以下是我正在使用的模板:
1tuwyuhd3#
如果您指定了
split.by.partition
方法,并且您的表没有分区,或者--staging-force
,teradata连接器将在默认情况下在连接url中的指定db中创建一个stage表。来自cloudera文档:
如果输入表没有分区,连接器将创建一个分区的暂存表,并执行insert into select查询,将数据从源表移到暂存表中。随后,每个Map器从一个分区传输数据,从而产生一个amp操作。使用单个放大器,可以使用大量Map器来获得最佳性能。可用的永久空间量必须与源表和执行select查询所需的假脱机空间量一样大。如果您的表已经分区,则不会创建额外的暂存表。但是,可以使用--staging force参数强制连接器重新划分数据,以获得更好的性能。在不强制重新划分数据的情况下,此方法会打开所有amp操作,因此应该使用20到30个Map器。如果源表是pi表,而split by列是表的主键,那么连接器将创建单个amp操作,并且可以使用大量Map器。
要解决这个问题,您必须避免转移,或者切换到
split.by.value
或者split.by.hash
或者可以为临时表指定不同的db(--staging-database
)你在这上面CREATE TABLE
许可。此外,考虑连接器将尝试在您有自由形式查询时创建一个视图(
--query
)还有多个Map绘制者。解决问题CREATE VIEW
指定的权限错误--table <TABLE_NAME>
如果加载整个表,仍然可以指定哪些列(--columns
)还有where过滤器(--where
),或者必须使用--num-mappers 1
.我个人认为应该有一个属性来启用/禁用视图的创建。如果正在执行导入数据工作流,则不需要创建视图和暂存表。