当我尝试创建数据集并简单地从中收集数据时,我遇到了一个奇怪的异常。
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 时(例如:没有属性 something 的 getSomething),就会导致异常。创建属性及其集合解决了异常,但没有解决我的问题。在我的真实代码中,“单独获取”是从复合属性(OtherPojo)获取值。
关于如何“告诉”分析器忽略此方法有什么想法吗? (我尝试了@Transiente上面的方法,但没有成功)
最佳答案
事实证明,我不能获取不属于该 bean 的获取。我假设它是分析器期望的“bean 格式”。 Introspector 当他发现一个没有其各自属性的 get 时,他会变得疯狂(根据 Java 版本,以不同的方式)。
由于我无论如何都找不到对分析器说“忽略此方法”,解决方案是避免与 bean 属性无关的 gets 和 sets 。
关于java - Spark 数据集 - NumberFormatException : Zero length BigInteger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55226928/