Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 性能:使用spark计算特定单词的频率_Java_Apache Spark - Fatal编程技术网

Java 性能:使用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 {

我正在从一个hdfs文件中读取单词,该文件的大小约为3.3 GB,并使用spark计算特定单词的频率

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)对不起,我这边没有更多的即时建议。希望其他人有进一步的想法。