我已经设置了一个数据传输作业来从Oracle数据库获取数据并将数据放入Google Bigquery中。
作业流程:ExecuteSQL -> AvroToJson -> PutBigQueryBatch
我已经转移了所有没有 BLOB 对象的表。当我使用 BLOB 对象为表运行此作业时,它会在 ExecuteSQL 处理器上引发以下错误:
ExecuteSQL failed to process session due to oracle.sql.BLOB.free()V;
Processor Administratively Yielded for 1 sec: java.lang.AbstractMethodError: oracle.sql.BLOB.free()V
这个答案建议使用ExecuteSQL处理器从Oracle获取BLOB数据,但我使用的是ExecuteSQL,它显示了此错误。我在使用 ExecuteSQL 时做错了什么?
配置:
- 源数据库:甲骨文 11g 第 2 版 源
- JDBC 驱动程序:源
- 目的地:大查询
- 作业的活动服务:DBCPConnectionPool、GCPCredentialsControllerService
DBCPConnectionPool 配置:
- 数据库连接网址:
jdbc:oracle:thin:@IP:host:sid
- 数据库驱动程序类名:
oracle.jdbc.driver.OracleDriver
- 数据库驱动程序位置:
C:Users91918DesktopOJDBC-Fullojdbc5.jar,C:Users91918DesktopOJDBC-Fullojdbc6.jar,C:Users91918DesktopOJDBC-Fullons.jar,C:Users91918DesktopOJDBC-Fullorai18n.jar,C:Users91918DesktopOJDBC-Fullsimplefan.jar,C:Users91918DesktopOJDBC-Fullucp.jar,C:Users91918DesktopOJDBC-Fullxdb6.jar
- 数据库用户:
username
- 密码:
password
- 验证查询:
SELECT 1 FROM DUAL
执行SQL配置:
- 数据库连接池服务:DBCPConnectionPool
- SQL 选择查询:从 schema.table 中选择 *
- 最长等待时间:0.1秒
- 规范化表/列名称:假
- 使用 Avro 逻辑类型:假
- 压缩格式:无
- 默认小数精度:10
甲骨文架构:
WAFERMAPID CHAR(16)
CDOTYPEID NUMBER(10)
CHANGECOUNT NUMBER(10)
MAPCONVERTID CHAR(16)
ISFROZEN NUMBER(10)
NAME VARCHAR2(120)
WAFERMAP BLOB
我对数据的意图:
将 BLOB 对象的二进制文件作为字符串读取,并将其放入 Bigquery 中。
有关 BLOB 的信息: 该 BLOB 对象是一个 GZ 文件。示例:文件.txt.gz。GZ 中的文件包含一个文本文件,其中包含 XML 中的文本。读取文件内的文本并将其放入 Bigquery 将是最终结果。
我认为这是因为您在"数据库驱动程序位置"属性中具有ojdbc5.jar
,因此如果驱动程序类存在于其中,则可能是正在加载的那个,在这种情况下,free()
方法不存在(检查此NB错误以获取更多详细信息(。删除它,它应该使用ojdbc6.jar
加载类,希望该错误会消失。