spark从oracle库抽取数据时,Number类型的数据小数位数变多

在项目中使用Spark从Oracle数据库抽取数据到Hive时,遇到Number类型数据小数位数增多甚至出现科学计数法的問題。经过排查,发现问题源自Spark SQL在处理Oracle的Number字段时的默认行为。通过查阅资料和源码,了解到解决方案是将Oracle的Number类型映射为StringType,以保持数据原样存储在Hive中。测试后问题得到解决,这是一个关于Spark SQL与Oracle数据迁移的教训。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中涉及到从oracle库抽取数据到hive库,出现了这样一个bug,抽取到hive库的数字小数位数格外的多,甚至有些出现了科学计数问题。
oracle的数据
oracle的数据
从oracle抽取到hive库的数据
从oracle抽取到hive库的数据
刚开始以为是代码中map部分的转换造成的
问题排查
于是将转换的部分注释了起来,直接取oracle的值总归是没错的吧。信誓旦旦的就把bug返了回去。
结果……没过多久bug又回来了,仔细一看,问题依旧如故。怎么会出现这样的问题呢?明明是直接从oracle查了数据直接插入hive,中间没有其他的转换。
于是在代码中将查询的oracle数据show()了一下,才发现,原来查出来的dataset中就已经是多了很多位了(以后不亲眼看到执行完的数据,坚决不返bug)。苦思不得,问问度娘先。
参考1:https://blog.youkuaiyun.com/qq_14950717/article/details/51323679
从这篇博客中得知
在1.6以前的版本中,当Oracle表字段为Number时,对应DataType为decimal
但是如何解决呢?
参考2:https://bbs.aliyun.com/detail/337340.html?page=e
这篇博客讲到了spark 读取oracle,字段类型为Date的处理
和我的问题很相似,于是乎看了看源码org.apache.spark.sql.jdbc.OracleDialect

private case object OracleDialect extends JdbcDialect {

  override def canHandle(url: String): Boolean = url.startsWith("jdbc:oracle")

  override 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值