Spark 数据集显示架构但为 show() 方法抛出 UnsupportedOperation 异常

Posted

技术标签:

【中文标题】Spark 数据集显示架构但为 show() 方法抛出 UnsupportedOperation 异常【英文标题】:Spark dataset shows schema but throws UnsupportedOperation exception for show() method 【发布时间】:2018-02-21 16:13:19 【问题描述】:

已使用自定义 java 类的 bean 编码器创建了 Spark 数据集

Encoder<CustomJavaType> customJavaEncoder = Encoders.bean(CustomJavaType.class);
Dataset<CustomJavaType> customJavaTypeDataset = sparkRunner.getSparkConfig().getSparkSession()
.createDataset(listofCustomJavaTypeObjects, customJavaEncoder);

customJavaTypeDataset.printschema() 工作得很好。它正确显示了架构。

但是,customJavaTypeDataset.show() 会抛出以下异常

java.lang.UnsupportedOperationException: Cannot grow BufferHolder by size 0 because the size after growing exceeds size limitation 2147483647
at org.apache.spark.sql.catalyst.expressions.codegen.BufferHolder.grow(BufferHolder.java:65)
at org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter.write(UnsafeRowWriter.java:214)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.apply2_2$(Unknown Source)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection.apply(Unknown Source)
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.executeTake(LocalTableScanExec.scala:72)
at org.apache.spark.sql.execution.CollectLimitExec.executeCollect(limit.scala:38)
at org.apache.spark.sql.Dataset.org$apache$spark$sql$Dataset$$collectFromPlan(Dataset.scala:2861)
at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:2150)
at org.apache.spark.sql.Dataset$$anonfun$head$1.apply(Dataset.scala:2150)
at org.apache.spark.sql.Dataset$$anonfun$55.apply(Dataset.scala:2842)
at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:65)
at org.apache.spark.sql.Dataset.withAction(Dataset.scala:2841)
at org.apache.spark.sql.Dataset.head(Dataset.scala:2150)
at org.apache.spark.sql.Dataset.take(Dataset.scala:2363)
at org.apache.spark.sql.Dataset.showString(Dataset.scala:241)
at org.apache.spark.sql.Dataset.show(Dataset.scala:637)
at org.apache.spark.sql.Dataset.show(Dataset.scala:596)
at org.apache.spark.sql.Dataset.show(Dataset.scala:605)

CustomJavaType 的所有嵌套类都实现了可序列化。 列表中的对象数为 5。 printSchema 符合预期。

【问题讨论】:

你能用自定义的java类分享你的完整代码吗? @Thirumal 你解决了吗?我们有一个类似的问题,当我们尝试将数据集写入 Parquet 文件时,printSchema 看起来都很好,但失败并出现类似的错误。 没有。不知何故 bean 编码器不工作。我最终使用 StructType 创建了一个精心设计的模式来构建数据集。 我相信我已经找到了触发此错误的位置,但我不知道如何解决它。我猜你不能在评论中添加图片,所以我将添加我所看到的作为答案...... 【参考方案1】:

这并不是问题的真正解决方案(请参阅我上面的评论),但它可能会帮助某人更接近......

我相信我已经找到了触发此错误的代码点。它位于 spark-catalyst_2.11-2.2.0:/.../org/apache/spark/sql/catalyst/expressions/UnsafeRow.java:getUTF8String 第 418 行。在那一行中,“long”被转换为“ int”,但该值对于 int 来说太大了,并且包装后的值会产生一个负数,然后将其用于尝试增大字节缓冲区(沿线某处,抛出并吞下 java.lang.NegativeArraySizeException /忽略)。

最终我们到达 spark-catalyst_2.11-2.2.0:/.../org/apache/spark/sql/catalyst/expressions/codegen/BufferHolder.java:grow line 64 if() 语句错误过大值的负值,从而引发 UnsupportedOperationException。

我不确定如何处理这些信息。也许有人知道。这种事情应该被报告为错误吗?

以下是我的调试器中的几个视觉效果,以显示详细信息:

【讨论】:

以上是关于Spark 数据集显示架构但为 show() 方法抛出 UnsupportedOperation 异常的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL/Spark 中使用窗口函数执行特定过滤器

spark编程指南

Spark 实践——音乐推荐和 Audioscrobbler 数据集

使用来自另一个数据集的值搜索和更新 Spark 数据集列

如何在 Spark 中显示 KeyValueGroupedDataset?

Spark基本架构及原理