Java 性能:使用spark计算特定单词的频率
我正在从一个hdfs文件中读取单词,该文件的大小约为3.3 GB,并使用spark计算特定单词的频率Java 性能:使用spark计算特定单词的频率,java,apache-spark,Java,Apache Spark,我正在从一个hdfs文件中读取单词,该文件的大小约为3.3 GB,并使用spark计算特定单词的频率 queryList是我必须计算其频率的单词集合 这是我当前的代码 //filter JavaRDD<String> filterFp = textFile.filter(new Function<String, Boolean>() { @Override public Boolean call(String s) throws Exception {
queryList
是我必须计算其频率的单词集合
这是我当前的代码
//filter
JavaRDD<String> filterFp = textFile.filter(new Function<String, Boolean>() {
@Override
public Boolean call(String s) throws Exception {
boolean res = s.equals(queryList.get(0));
for (int i = 1; i < queryList.size(); i++) {
res = res || s.equals(queryList.get(i));
}
return res;
}
});
// map
JavaPairRDD<String, Integer> mapper =
filterFp.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String s) throws Exception {
return new Tuple2<>(s, 1);
}
});
// reduce
JavaPairRDD<String, Integer> counts = mapper.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) throws Exception {
return integer + integer2;
}
});
//过滤器
javarddfilterfp=textFile.filter(新函数(){
@凌驾
公共布尔调用(字符串s)引发异常{
布尔res=s.equals(queryList.get(0));
对于(int i=1;i
所有作业时间的总和为5-6秒
是否有任何方法可以更好地优化我的任务。您的过滤器本质上是queryList.contains,没有短路优化,当queryList很长时,这可能会产生相当大的影响。更好的方法是:事先将queryList转换为哈希集,然后简单地筛选querySet.contains。
queryList
is<50@mtjs,直到尝试该建议。现在,仅在过滤器中就有O(n)复杂度,可以将其简化为O(1)。我尝试过,但没有多大帮助,主要是因为这是O(50)到O(1)对不起,我这边没有更多的即时建议。希望其他人有进一步的想法。您的过滤器本质上是queryList.contains,没有短路优化,当queryList很长时,这可能会产生相当大的影响。更好的方法是:事先将queryList转换为哈希集,然后简单地筛选querySet.contains。queryList
is<50@mtjs,直到尝试该建议。现在,仅在过滤器中就有O(n)复杂度,可以将其简化为O(1)。我尝试过,但没有多大帮助,主要是因为这是O(50)到O(1)对不起,我这边没有更多的即时建议。希望其他人有进一步的想法。