如何配置ExecuteSQL处理器以从Oracle 11g第2版获取BLOB对象,而不是在Apache Nifi中抛出方



我已经设置了一个数据传输作业来从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 时做错了什么?

配置:

  1. 源数据库:甲骨文 11g 第 2 版
  2. JDBC 驱动程序:源
  3. 目的地:大查询
  4. 作业的活动服务:DBCPConnectionPool、GCPCredentialsControllerService

DBCPConnectionPool 配置:

  1. 数据库连接网址:jdbc:oracle:thin:@IP:host:sid
  2. 数据库驱动程序类名:oracle.jdbc.driver.OracleDriver
  3. 数据库驱动程序位置: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
  4. 数据库用户:username
  5. 密码:password
  6. 验证查询:SELECT 1 FROM DUAL

执行SQL配置:

  1. 数据库连接池服务:DBCPConnectionPool
  2. SQL 选择查询:从 schema.table 中选择 *
  3. 最长等待时间:0.1秒
  4. 规范化表/列名称:假
  5. 使用 Avro 逻辑类型:假
  6. 压缩格式:无
  7. 默认小数精度: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加载类,希望该错误会消失。

最新更新