spark 词频统计方法和代码

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

import scala.Tuple2;
//案列  词频统计  统计data.txt中  各个单词出现的次数
public class RddFunc {
    public static void fun_rdd(JavaSparkContext jsc) {
        //确认输入文件所在地
        String path = "f:/data.txt";
        //读取文件中的信息  相当于把文件内容转换成Rdd
        JavaRDD<String> textFilerdd = jsc.textFile(path);
        //获取文件中的信息
        List<String> aa = textFilerdd.collect();
        //用flatmap算子  把里面的元素变成键值  值默认为1
        JavaRDD<String> flatMap = textFilerdd.flatMap(f ->{
            String[] split = f.split(" ");
            /* 把数组变成容器,
             * 容器再变成迭代器 */
            List<String> asList = Arrays.asList(split);
            return asList.iterator();
        } );
        /*mapTopair 在java中把string变成元组  相当spark中的map
         * 第一个泛型是参数rdd里面的元素类型
         * 第二个泛型是返回值:rdd里面的key
         * 第三个泛型是返回值:rdd里面的value
         * new PairFunction<T, K, V> 
         */
        //[(this,1), (is,1), (a,1), (book,1), (this,1), (is,1), (a,1), (book,1), (hadoop,1), (hive,1), (hbase,1), (hive,1), (hbase,1), (hadoop,1), (hbase,1), (spark,1), (sqoop,1)]

        JavaPairRDD<String, Integer> mapToPair = flatMap.mapToPair(f -> new Tuple2<String,Integer>(f, 1));
      // 调用 reducebykey算子 把上一步的结果 根据相同的键  把他的值给合并起来
        JavaPairRDD<String, Integer> reduceByKey = mapToPair.reduceByKey((a,b)->a+b);
      //把reducebykey的键值用maptopair算子反过来 然后用sortbykek算子排序
        JavaPairRDD  mapToPair2 = reduceByKey.mapToPair(f -> new Tuple2<Integer,String>(f._2,f._1));
        JavaPairRDD <String,Integer>sortByKey = mapToPair2.sortByKey(false);
        //把最后的结果再用 maptopair算子反过来
        JavaPairRDD<String, Integer> mapToPair3 = sortByKey.mapToPair(f -> new Tuple2<String,Integer>(f._1,f._2));
        System.out.println(mapToPair3.collect());
    }
    //第二种方法++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
    public static void main(String[] args) {
        System.out.println("===Tom===");
        System.setProperty("hadoop.home.hir", "F:/ruanjian/hadoop-2.7.2");
        SparkConf conf = new SparkConf();
        conf.setAppName("RddFunc");
        conf.setMaster("local");
        JavaSparkContext jsc = new JavaSparkContext(conf);
        
        //fun_rdd(jsc);
        fun_rdd1(jsc);
        jsc.stop();
    }
    private static void fun_rdd1(JavaSparkContext jsc) {
        String path = "f:/data.txt";
        JavaRDD<String> textFile = jsc.textFile(path);
        JavaRDD<String> flatMap = textFile.flatMap(f -> {
            /* 把数组变成容器,
             * 容器再变成迭代器 */
            String[] split = f.split(" ");
            List<String> asList = Arrays.asList(split);
            return asList.iterator();
        });
        //这里用flatmap算子把元素变成元组 
        JavaPairRDD <String,Integer>mapToPair = flatMap.mapToPair(f -> new Tuple2<String,Integer>(f, 1));
        //把元组里键相同的值给放在一起得到一个元组(string,iterator(a...b))
        JavaPairRDD<String, Iterable<Integer>> groupByKey = mapToPair.groupByKey();
        //把单词相同的值相加
        JavaPairRDD<String, Integer> mapToPair2 = groupByKey.mapToPair(f -> {
            String key = f._1;
            //值是一个元组  拿出来 下面进行相加操作
            Iterator<Integer> iterator = f._2.iterator();
            int res = 0;
            //使用迭代器
            /*
             * for (iterator.hasNext()){ Integer a = iterator.next; res+=a; }
             */
            //使用加强for
            for (Integer s : f._2) {
                res+=s;
                
            }
            //这里可以直接换位键值
            return new Tuple2(res, key);
        });
        //进行排序
        JavaPairRDD<String, Integer> sortBy = mapToPair2.sortByKey(false);
        //把键值换位
        sortBy.mapToPair(f -> new Tuple2(f, 2));
        System.out.println(mapToPair2.collect());
    }
}

转载于:https://my.oschina.net/u/4150784/blog/3074369

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值