火花错误 - 小数精度 39 超过最大精度 38
Posted
技术标签:
【中文标题】火花错误 - 小数精度 39 超过最大精度 38【英文标题】:Spark error - Decimal precision 39 exceeds max precision 38 【发布时间】:2017-10-23 03:35:54 【问题描述】:当我尝试从 Spark 数据帧收集数据时,我收到一条错误提示
“java.lang.IllegalArgumentException:要求失败:十进制 精度 39 超过最大精度 38"。
Spark 数据框中的所有数据都来自 Oracle 数据库,我认为十进制精度为
# Load required table into memory from Oracle database
df <- loadDF(sqlContext, source = "jdbc", url = "jdbc:oracle:thin:usr/pass@url.com:1521" , dbtable = "TBL_NM")
RawData <- df %>%
filter(DT_Column > DATE(‘2015-01-01’))
RawData <- as.data.frame(RawData)
报错
下面是堆栈跟踪:
WARN TaskSetManager:在 0.0 阶段丢失任务 1.0(TID 1、10...***, 执行程序 0):java.lang.IllegalArgumentException:要求失败: 小数精度 39 超过最大精度 38 scala.Predef$.require(Predef.scala:224) 在 org.apache.spark.sql.types.Decimal.set(Decimal.scala:113) 在 org.apache.spark.sql.types.Decimal$.apply(Decimal.scala:426) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$3$$anonfun$9.apply(JdbcUtils.scala:337 ) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$3$$anonfun$9.apply(JdbcUtils.scala:337 ) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$nullSafeConvert(JdbcUtils.scala:438) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$3.apply(JdbcUtils.scala:337) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$3.apply(JdbcUtils.scala:335) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anon$1.getNext(JdbcUtils.scala:286) 在 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anon$1.getNext(JdbcUtils.scala:268) 在 org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73) 在 org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32) 在 org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(未知 来源)在 org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) 在 org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:377) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:231) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:225) 在 org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:826) 在 org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:826) 在 org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 在 org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 在 org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 在 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 在 org.apache.spark.scheduler.Task.run(Task.scala:99) 在 org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)
请提出任何解决方案。谢谢。
【问题讨论】:
你有解决办法吗?我在使用 Python 和 Spark-2.4 时遇到了同样的问题 希望这个问题也被某个地方的人解决了...... 【参考方案1】:使用 AWS Glue 和 Postgres 解决了这个问题。 Spark 2.1.0 中有一个 bug 已为大多数人修复,但有人在 cmets 中发布了关于使用 customSchema option 的解决方法。
我在使用 AWS Glue 和 Spark SQL 时遇到了类似的问题:我正在计算货币金额,所以结果是浮点数。即使 Glue 数据目录将该列定义为小数,Glue 仍会引发错误 Decimal precision 1 exceeds max precision -1
。通过将列显式转换为 NUMERIC(10,2) 从上述 customSchema 解决方案中获取一页,Spark 停止抱怨。
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于火花错误 - 小数精度 39 超过最大精度 38的主要内容,如果未能解决你的问题,请参考以下文章