我有一个自定义对象的数据集,它包含一个标签:Double
和特征:DenseVector
。
我想过滤并计算具有特定标签和特征中特定值的项目的数量。
然而,:
dataLF.filter(entry => entry.label == 1 && entry.features.values(0) == 0).count()
返回这个异常:
Job aborted due to stage failure: task0 in stage 13.0 failed 1次,最近一次失败:在阶段13.0 (TID 44, localhost)中丢失任务0.0的实例不能赋值scala.collection.immutable。列出$SerializationProxy到字段filterexec . otherpreds的类型collection. seq的实例org.apache.spark.sql.execution.FilterExec
我做错了什么?
我不明白为什么你在DenseVector上调用值,你确定你不是这个意思(访问向量的第一个元素)吗?:
dataLF.filter(entry => entry.label == 1 && entry.features(0) == 0).count()
我不确定您是否遇到了与我相同的问题,但是在我使用sbt assembly
打包jar文件然后在EMR集群上spark提交它之后,我看到了与您的情况类似的错误消息。
根据文献,在dataset.filter()
中使用lambda函数还处于实验阶段,
所以,我试着把我的代码改成像dataframe.filter(col("type") === "open")
这样的东西,它可以正常工作,没有错误。
对于我的案例来说,这是一个奇怪但微不足道的问题。对于sbt assembly
的情况,jar文件被命名为"Simple Project-assembly-0.0.1.jar"(文件名中有一个空格)在我将它重命名为"simple-project.jar"之后,一切都正常了。