java - Spark 数据集 - NumberFormatException : Zero length BigInteger

标签 java apache-spark apache-spark-sql

当我尝试创建数据集并简单地从中收集数据时,我遇到了一个奇怪的异常。

Exception in thread "main" java.lang.NumberFormatException: Zero length BigInteger
    at java.math.BigInteger.<init>(BigInteger.java:302)
    at org.apache.spark.sql.catalyst.expressions.UnsafeRow.getDecimal(UnsafeRow.java:405)
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.writeFields_3_3$(generated.java:298)
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.apply(generated.java:35)
    at org.apache.spark.sql.execution.LocalTableScanExec$$anonfun$unsafeRows$1.apply(LocalTableScanExec.scala:41)
    at org.apache.spark.sql.execution.LocalTableScanExec$$anonfun$unsafeRows$1.apply(LocalTableScanExec.scala:41)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
    at scala.collection.AbstractTraversable.map(Traversable.scala:104)
    at org.apache.spark.sql.execution.LocalTableScanExec.unsafeRows$lzycompute(LocalTableScanExec.scala:41)
    at org.apache.spark.sql.execution.LocalTableScanExec.unsafeRows(LocalTableScanExec.scala:36)
    at org.apache.spark.sql.execution.LocalTableScanExec.executeCollect(LocalTableScanExec.scala:67)
    at org.apache.spark.sql.Dataset.org$apache$spark$sql$Dataset$$collectFromPlan(Dataset.scala:3278)
    at org.apache.spark.sql.Dataset$$anonfun$collectAsList$1.apply(Dataset.scala:2739)
    at org.apache.spark.sql.Dataset$$anonfun$collectAsList$1.apply(Dataset.scala:2738)
    at org.apache.spark.sql.Dataset$$anonfun$52.apply(Dataset.scala:3259)
    at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:77)
    at org.apache.spark.sql.Dataset.withAction(Dataset.scala:3258)
    at org.apache.spark.sql.Dataset.collectAsList(Dataset.scala:2738)
    at com.temp.SparkTest.execute(SparkTest.java:85)
    at com.temp.SparkTest.main(SparkTest.java:104)

执行代码如下所示:

List<SimplePojo> list ...
Dataset<SimplePojo> ds = sparkSession.createDataset(list, Encoders.bean(SimplePojo.class))
ds.collectoAsList();

SimplePojo 类包含一个明显导致异常的方法 getSomething()。当我注释掉它时,一切正常。

public class SimplePojo {

   private int id;
   private OtherPojo otherPojo = new OtherPojo();

   @Deprecated // required by park serialization. Use builder
   public SimplePojo(){}

   publi int getId(){
      return id;
   }

   public String getSomething() {
      return otherPojo.getSomething();
   }

   // sets ...
}

有人知道会发生什么吗?

提前致谢!

更新

原因: 上面的代码没有属性 something。当 bean 分析器(Introspector 或类似的东西)找到​​没有相应属性的 get 时(例如:没有属性 somethinggetSomething),就会导致异常。创建属性及其集合解决了异常,但没有解决我的问题。在我的真实代码中,“单独获取”是从复合属性(OtherPojo)获取值。

关于如何“告诉”分析器忽略此方法有什么想法吗? (我尝试了@Transiente上面的方法,但没有成功)

最佳答案

事实证明,我不能获取不属于该 bean 的获取。我假设它是分析器期望的“bean 格式”。 Introspector 当他发现一个没有其各自属性的 get 时,他会变得疯狂(根据 Java 版本,以不同的方式)。

由于我无论如何都找不到对分析器说“忽略此方法”,解决方案是避免与 bean 属性无关的 getssets

关于java - Spark 数据集 - NumberFormatException : Zero length BigInteger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55226928/

相关文章:

r - 如何让sparklyr::spark_apply() 产生多个worker?

scala - 如何在spark scala的数组中添加空值

java - 如何在android中访问在线mysql数据库?

java - 在辅助监视器上打开模式对话框的简单方法?

scala - 并行处理多个文件作为独立的 RDD

sql - 如何在 Azure databricks SQL 中将字段值转换为逗号分隔

apache-spark - 仅使用 spark sql 在表/ View 中删除列

java - MicroBatchExecution : Query terminated with error UnsatisfiedLinkError: org. apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

java - ForkJoinPool 中的 Execute 、 Submit 和 Invoke() 之间的区别

java - 检查某些项目是否位于数组列表的底部