如何解决 java.sql.SQLException:[SQL7008] database_name 中的 table_name 对操作无效,而 sqoop 从 hdfs 导出到 DB2
Posted
技术标签:
【中文标题】如何解决 java.sql.SQLException:[SQL7008] database_name 中的 table_name 对操作无效,而 sqoop 从 hdfs 导出到 DB2【英文标题】:How to resolve java.sql.SQLException: [SQL7008] table_name in database_name not valid for operation while sqoop export from hdfs to DB2 【发布时间】:2019-08-01 19:18:12 【问题描述】:我正在尝试使用 sqoop 导出将文件从 HDFS 导出到 DB2 AS400 表并出现以下错误:
Caused by: java.sql.SQLException: [SQL7008] SCORE in OPIDSYS not valid for operation.
当我在网上研究时,我得到了这个链接:http://www.websina.com/bugzero/faq/exception-as400.html
但我不确定日记是什么意思,我的 AS400 架构师也不知道。
我的 Sqoop:
sqoop export --driver com.ibm.as400.access.AS400JDBCDriver --connect jdbc:as400://SERVER:0000/DB --username xxx --password 'xxx' --table DB.SCORE --direct --export-dir '/test/path/' --input-fields-terminated-by ',' --input-lines-terminated-by '\n' --input-null-string '\\\\N' --input-null-non-string '\\\\N' --verbose
示例 hdfs 数据:
match,score
11,2
22,9
33,4
【问题讨论】:
自称为 AS400 架构师的人应该真正了解什么是日志。你在谷歌上搜索时发现的很可能是正确的答案。这是一篇关于什么是日记以及它的作用的好文章ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/rzaki/… 【参考方案1】:SQL7008 有多种原因,如果不查看消息的 Secondary 文本中的原因代码,则无法确定确切的原因。其中一个原因是您尝试对未记录的表使用承诺控制。
日志是 DB2 for i 用来记录数据库事务的方法,并且被提交控制用来启用commit
和rollback
。事实上,记录级访问(READ、CHAIN 等)和 SQL 也是如此,尽管 RLA 默认为无承诺控制,而 SQL 默认为使用承诺控制。如果你的表没有被记录,你仍然可以使用 SQL。
在创建带有嵌入式提交控制(CRTSQLRPG、CRTSQLRPGI 等)或使用 RUNSQLSTM 的程序时,您需要确保使用 COMMIT(*NONE)。默认值为 COMMIT(*CHG)。 STRSQL 的默认值已经是 COMMIT(*NONE)。
如果您通过 DBeaver 或 SQuirreL SQL 客户端等客户端使用 SQL,则需要确保连接默认为无提交控制。具体如何执行此操作会有所不同,具体取决于您使用的是 JDBC 还是 ODBC 进行连接,但您应该能够找到每个特定的连接属性。
如果您真的想使用承诺控制(不是一个坏主意),那么您需要开始记录数据库中需要受承诺控制保护的所有物理文件(表),如果这还不是全部您需要记住选择性地关闭那些未记录的表的提交控制,INSERT
、UPDATE
和 DELETE
语句上的 WITH NC
子句将执行此操作。
要开启日记功能,您需要确保拥有日记和日记接收器。如果它们不存在,则将它们与您的物理文件放在同一个库中。首先使用CRTJRNRCV
创建接收器,然后使用CRTJRN
创建一个日志。 CRTJRN
将需要您之前创建的接收者的名称。拥有日志后,您可以使用 STRJRNPF
开始对您需要置于承诺控制之下的每个物理文件进行日志记录。
【讨论】:
以上是关于如何解决 java.sql.SQLException:[SQL7008] database_name 中的 table_name 对操作无效,而 sqoop 从 hdfs 导出到 DB2的主要内容,如果未能解决你的问题,请参考以下文章