Kou*_*hik 5 oracle r rstudio apache-spark
当我尝试从 Spark 数据帧收集数据时,出现错误提示
“java.lang.IllegalArgumentException:要求失败:小数精度 39 超过最大精度 38”。
Spark 数据帧中的所有数据都来自 Oracle 数据库,我相信小数精度小于 38。有什么方法可以在不修改数据的情况下实现这一目标?
# 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)
Run Code Online (Sandbox Code Playgroud)
给出错误
以下是堆栈跟踪:
警告 TaskSetManager:在阶段 0.0 中丢失任务 1.0(TID 1、10。 ..***, executor 0): java.lang.IllegalArgumentException: 要求失败:在 org.apache.spark.sql.types 的 scala.Predef$.require(Predef.scala:224) 处,小数精度 39 超过最大精度 38。 Decimal.set(Decimal.scala:113) at org.apache.spark.sql.types.Decimal$.apply(Decimal.scala:426) at 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。 org.apache.spark.sql.execution.BufferedRowIterator 上的 processNext(Unknown Source)。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)
请提出任何解决方案。谢谢你。
使用 AWS Glue 和 Postgres 遇到了这个问题。Spark 2.1.0 中存在一个错误,为大多数人修复了该错误,但有人在有关使用customSchema 选项的评论中发布了解决方法。
我在使用 AWS Glue 和 Spark SQL 时遇到了类似的问题:我正在计算货币金额,因此结果是浮点数。Decimal precision 1 exceeds max precision -1即使 Glue 数据目录将该列定义为小数,Glue 也会引发错误。通过将列显式转换为 NUMERIC(10,2),从上面的 customSchema 解决方案中获取了一个页面,Spark 停止了抱怨。
| 归档时间: |
|
| 查看次数: |
6164 次 |
| 最近记录: |