Spark从Parquet建DataFrame写入Oracle报ORA-01461错误求助
解决ORA-01461: can bind a LONG value only for insert into a LONG column错误
排查与修复方案
强制指定JDBC字段绑定类型
哪怕DataFrame里字段是string且长度仅52,Spark JDBC驱动可能还是会错误把它识别成LONG类型绑定到Oracle的CLOB列。可以通过connectionProperties自定义字段的JDBC映射:val connectionProperties = new Properties() connectionProperties.put("user", "你的用户名") connectionProperties.put("password", "你的密码") // 替换content为实际问题列名,指定对应类型为CLOB connectionProperties.put("customSchema", "content CLOB") df.write .mode(SaveMode.Append) .jdbc("jdbc:oracle:thin:@//host:port/db", "目标表名", connectionProperties)也可以试试加
option("truncate", "true")(允许清空表的前提下),部分场景能触发驱动正确识别字段类型。确认Oracle目标表列的真实类型
别光看自己改了CLOB,得确认数据库里列的实际类型是不是真的变成CLOB了。执行Oracle命令查一下:SELECT column_name, data_type, data_length FROM user_tab_columns WHERE table_name = '目标表名';如果结果还是LONG,重新执行修改语句:
ALTER TABLE 目标表名 MODIFY content CLOB; COMMIT;调整Spark JDBC批处理参数
批量写入时容易出现类型绑定异常,试试禁用批处理或者调小批大小:df.write .mode(SaveMode.Append) .option("batchsize", "1") .option("isolationLevel", "READ_COMMITTED") .jdbc(jdbcUrl, tableName, connectionProperties)校验Parquet文件的Schema
虽然你说DataFrame字段是string,但Parquet元数据可能残留原LONG类型的信息。用Spark打印Parquet的Schema看看:val parquetDf = spark.read.parquet("Parquet文件路径") parquetDf.printSchema()如果Schema有问题,读Parquet时显式指定字段类型:
import org.apache.spark.sql.types._ val customSchema = StructType(Array( StructField("id", IntegerType, nullable = true), StructField("content", StringType, nullable = true) // 其他字段按实际情况添加 )) val parquetDf = spark.read.schema(customSchema).parquet("Parquet文件路径")
内容的提问来源于stack exchange,提问作者Vishal Prajapati
相关产品推荐
相关产品推荐

