• WordCount(Java、Scala、Python)


    处理数据常用的语言,使用基本的api处理一个wordcount

    读取文件,找出单词(转大写)出现次数,并排序,获取TopK数据。

    scala语言

     def main(args: Array[String]): Unit = {
    
        //读取文件
       val source: BufferedSource = Source.fromFile("dir/wordcount.txt")
    
        /*
           hadoop Spark hive
          Spark Flink hadoop
          java scala hadoop
          Spark Hadoop Java
        */
        val text:String =source.mkString
        
        //切分字符串为数组
        val strings: Array[String] = text.split("\W+")
    
        //处理数据
        strings.map(_.toUpperCase).map((_,1)).groupBy(_._1).map(k=>(k._1,k._2.length)). //转大写->转元组->分组->聚合
          toArray.sortBy(_._2).reverse                       //排序->反转->遍历
          .foreach(println)
        
        /*
        (HADOOP,4)
        (SPARK,3)
        (JAVA,2)
        (HIVE,1)
        (SCALA,1)
        (FLINK,1)
         */
        source.close()
    
      }
    

    Java语言

    Java中的集合要转换为Stream才支持高阶函数。

            FileReader reader = new FileReader(new File("dir/wordcount.txt"));
            char[] chars=new char[1024];
            int len = reader.read(chars);
    
            Stream<String> stream = Stream.of(new String(chars).split("\W+"));//分割字符串并转流
    
            java.util.Map<String, Long> collect = stream.map(String::toUpperCase).collect(Collectors.groupingBy(s->s,Collectors.counting())); //转大写->分类->聚合
    		
    		//wordCount完成
            System.out.println(collect); //{JAVA=3, HIVE=1, HADOOP=4, SCALA=1, HDFS=1, SPARK=3, HBASE=1, YARN=1, FLINK=1}
    
            reader.close();
    
    
    		//排序
            List<java.util.Map.Entry<String, Long>> entryList = collect.entrySet().stream().sorted((e1, e2) -> Long.compare(e1.getValue(), e2.getValue()))
                    .collect(Collectors.toList());
    
            Collections.reverse(entryList);//翻转链表
    		
    		//获取Top5数据,TopK完成
            entryList.stream().limit(5).forEach(System.out::println);
            /*
           HADOOP=4
            SPARK=3
            JAVA=3
            FLINK=1
            YARN=1
             */
    

    Python

    Python虽然也支持一点函数式编程,但使用还是很吃力

    import re
    import copy
    
    # 读取文件
    with open('wordcount.txt', 'r') as file:
        text = file.readlines()
        file.close()
    
    # 将text处理成字符串
    lines = ''.join(text).upper()
    
    """ lines:
    HADOOP SPARK HIVE YARN HDFS
    SPARK FLINK HADOOP JAVA
    JAVA SCALA HADOOP HBASE
    SPARK HADOOP JAVA
    """
    
    
    word = re.split("\s+", lines)
    """分割字符串
    ['HADOOP', 'SPARK', 'HIVE', 'YARN','HDFS', 'SPARK', 'FLINK', 'HADOOP', 'JAVA', 'JAVA', 'SCALA', 'HADOOP','HBASE', 'SPARK', 'HADOOP', 'JAVA']
    """
    
    data = list(map(lambda x: (x,1), word))
    """生成元组data:
    [('HADOOP', 1), ('SPARK', 1), ('HIVE', 1), ('YARN', 1), ('HDFS', 1), ('SPARK', 1), ('FLINK', 1), ('HADOOP', 1), 
    ('JAVA', 1), ('JAVA', 1), ('SCALA', 1), ('HADOOP', 1), ('HBASE', 1), ('SPARK', 1), ('HADOOP', 1), ('JAVA', 1)]
    """
    
    #  深拷贝一份,用来形成字典
    new_data = copy.copy(data)
    
    new_list = list(dict(new_data))
    """ 元数据,没有重复:
    ['HADOOP', 'SPARK', 'HIVE', 'YARN', 'HDFS', 'FLINK', 'JAVA', 'SCALA', 'HBASE']
    """
    
    topK = []  # 去重后的数据,还未排序
    c = 0  # 用于计数
    
    #  计数,形成新列表
    for i in new_list:
        for j in data:
            if i == j[0]:
                c+=1
        topK.append((c, i))
        c=0
    
    #   排序,翻转
    topK.sort(reverse=True)
    
    
    #   获取Top5
    for word in topK[0:5]:
        print(word)
    
    """
    (4, 'HADOOP')
    (3, 'SPARK')
    (3, 'JAVA')
    (1, 'YARN')
    (1, 'SCALA')
    """
    
    
    
  • 相关阅读:
    [poj] 3068 "Shortest" pair of paths || 最小费用最大流
    [poj] 3686 The Windy's || 最小费用最大流
    [poj] 1235 Farm Tour || 最小费用最大流
    [poj] 3281 Dining || 最大流
    [poj] 3041 Asteroids || 最小点覆盖=最大二分图匹配
    luogu P1072 Hankson 的趣味题
    二分图最佳匹配
    181106 solution
    luogu P2216 [HAOI2007]理想的正方形
    luogu P4362 [NOI2002]贪吃的九头龙
  • 原文地址:https://www.cnblogs.com/cgl-dong/p/14142966.html
Copyright © 2020-2023  润新知