首页 > 解决方案 > 将 Oracle blob 列(图像数据)写入文件的问题

问题描述

尝试将 blob 数据写入文件时,出现以下异常。

代码 :

Dataset<Row> dataset = sparkSession.read()
    .format("jdbc")
    .option("url", "jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xxx )(PORT = 1234))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = xx)))")
    .option("dbtable", "(select UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CAST_TO_RAW(lob_id)) as lob_id ,  blob_data from tableX ) test1")
    .option("user", "user")
    .option("password", "pass")
    .option("driver", "oracle.jdbc.driver.OracleDriver")
    .load(); 
    
dataset.foreach((ForeachFunction<Row>) row -> {

  String lobId = row.getAs("LOB_ID");
  byre blobData[] = (byte[])row.getAs("BLOB_DATA");

  Path filePath = Paths.get("/some/path/xx.dat" );
  Files.write(filePath, blobData);
}
);

错误:

Exception:java.io.NotSerializableException: com.xx
Serialization stack:
    - object not serializable (class: com.xx, value: com.xx@2d34866a)
    - element of array (index: 0)
    - array (class [Ljava.lang.Object;, size 1)
    - field (class: java.lang.invoke.SerializedLambda, name: capturedArgs, type: class [Ljava.lang.Object;)
    - object (class java.lang.invoke.SerializedLambda, SerializedLambda[capturingClass=class com.xx, functionalInterfaceMethod=org/apache/spark/api/java/function/ForeachFunction.call:(Ljava/lang/Object;)V, implementation=invokeSpecial - writeReplace data (class: java.lang.invoke.SerializedLambda)
    - object (class com.xx$$Lambda$1655/1788026663, com.xx$$Lambda$1655/1788026663@28b8c2f9)
    - element of array (index: 0)
    - array (class [Ljava.lang.Object;, size 1)
    - field (class: java.lang.invoke.SerializedLambda, name: capturedArgs, type: class [Ljava.lang.Object;)
    
    

标签: apache-spark-sql

解决方案


推荐阅读