spark JavaRDDLike接口有api
takeOrdered(int num, java.util.Comparator<T> comp)
或
top(int num,java.util.Comparator<T> comp)
返回第一个k元素,但是当我使用带有collect方法的wordcount示例进行测试时,我收到了以下错误。
org.apache.spark.SparkException: Job aborted due to stage failure: Task not serializable: java.io.NotSerializableException
有人能帮助我吗? 非常感谢。
答案 0 :(得分:3)
要使top()
或takeOrdered()
正常工作,您必须确保自己的工作
自定义比较器类实现java.io.Serializable
。方法如下:
这里我的RDD元素(T)是Tuple2<String, Integer>
,我想要的
排序要在第二个元组元素上完成,这是一个整数:
import java.util.Comparator;
import java.io.Serializable;
....
static class MyTupleComparator implements
Comparator<Tuple2<String, Integer>>, Serializable {
final static MyTupleComparator INSTANCE = new MyTupleComparator();
// note that the comparison is performed on the key's frequency
// assuming that the second field of Tuple2 is a count or frequency
public int compare(Tuple2<String, Integer> t1,
Tuple2<String, Integer> t2) {
return -t1._2.compareTo(t2._2); // sort descending
// return t1._2.compareTo(t2._2); // sort ascending
}
}
然后传递MyTupleComparator.INSTANCE
作为比较器。
我在YARN上运行Spark时注意到的另一件事是
你的Spark驱动程序应该实现java.io.Serializable
界面也是如此。
最好的问候,
Mahmoud Parsian