无法从Spark 2.0.1中的数据集/数据框中收集数据;获取ClassCastException

时间:2016-10-25 01:03:55

标签: scala apache-spark

我有一些json数据是键值对,其中int是键,而int列表是值。我想将这些数据读入地图然后进行广播,以便其他RDD可以使用它进行快速查找。

我的代码适用于数据中心的1.6.1 spark集群,但相同的代码在AWS中的2.0.1 spark集群中不起作用。适用的1.6.1代码:

AudioManager.Play(clip);

我为2.0.1我尝试过:

import scala.collection.mutable.WrappedArray
sc.broadcast(sqlContext.read.schema(mySchema).json(myPath).map(r => (r.getInt(0), r.getAs[WrappedArray[Int]].toArray)).collectAsMap)

这让我得到了我想要的东西:

val myData = sqlContext.read.schema(mySchema).json(myPath).map(r => (r.getInt(0), r.getSeq[Int].toArray))

但是当我这样做时:

org.apache.spark.sql.Dataset[(Int, Array[Int])] = [_1: int, _2: array<int>]

我明白了:

java.lang.ClassCastException:无法将scala.collection.immutable.List $ SerializationProxy的实例分配给字段org.apache.spark.rdd.RDD.org $ apache $ spark $ rdd $ RDD $$ dependencies_类型为scala。 collection.Seq在org.apache.spark.rdd.MapPartitionsRDD

的实例中

有谁知道我怎么能在2.0.1中做到这一点?这是我想要做的一件非常简单的事情。

提前致谢,

罗宾

1 个答案:

答案 0 :(得分:0)

我发现我的问题是2.0.1中的spark shell。如果我使用现有的sc和sqlContext作为shell创建的spark会话的一部分,我发布的代码工作正常。如果我调用stop并使用自定义配置创建一个新会话,我将得到上面的奇怪错误。我不喜欢这个,因为我想改变spark.driver.maxResultSize。

无论如何,经验教训是:如果您使用spark shell测试代码,请使用现有会话,否则它可能无效。