Spark scala编程练习题——HanLP分词统计热词

接上文:
https://blog.csdn.net/qq_38151907/article/details/128110112?spm=1001.2014.3001.5501
中的题目大纲

需求:
查询关键词分析,使用HanLP对所有查询词(字段3)进行分词,按照分词进行分组聚合统计出现次数,结果写入本地/root/retrievelog/output/key/part-00000,格式见步骤说明。

获取搜索词(字段3),进行中文分词;
使用HanLP中文分词库进行分词,对应依赖包为hanlp-portable-1.8.2.jar(见左侧“竞赛信息“-“附件资料“);
统计搜索词出现次数,分组统计次数,词频降序排序;
文件保存路径为:/root/retrievelog/output/key/part-00000,结果无需分区;
示例结果:(69239,物资)表示关键词物资的词频计数为69239。

maven依赖见上文

scala代码如下:

package com.dd.spark

import java.io.{File, PrintWriter}
import java.util

import com.hankcs.hanlp.seg.common.Term
import com.hankcs.hanlp.tokenizer.StandardTokenizer
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object LogAnalyse03 {


  def main(args: Array[String]): Unit = {

    val sparkConf= new SparkConf().setMaster("local[*]").setAppName("LogAnalyse03")

    val sc : SparkContext = new SparkContext(sparkConf)

    //加一个过滤
    val fileRDD: RDD[String] = sc.textFile("D:\\test1128\\reduced.txt")
      .filter(_.split("\t").size==5).filter(_.split("\t")(3).split(" ").size==2)



    val firstRDD: RDD[String] = fileRDD.map( _.split("\t")(2))

    val HanLPRDD: RDD[util.List[Term]] = firstRDD.map(StandardTokenizer.segment(_))

    val StringRDD: RDD[String] = HanLPRDD.map(
      str=>{

        var re=str.get(0).word
        for(i <- 1 to str.size()-1){
          re=re+"|=|"+str.get(i).word
        }
        re
      }
    )


    val value: RDD[String] = StringRDD.flatMap(_.split("\\|=\\|"))

    //wordcount操作
    val wordRDD: RDD[(String, Int)] = value.map((_,1))

    //按照key聚合一下
    val byKeyRDD: RDD[(String, Int)] = wordRDD.reduceByKey(_+_)

    //搞一下排序
    val sortRDD: RDD[(String, Int)] = byKeyRDD.sortBy(_._2,false)

    val writer = new PrintWriter(new File("D:\\test1128\\result03.txt"))
    val tuples = sortRDD.collect()
    for (elem <- tuples) {
      writer.write("("+elem._2 + "," + elem._1 + ")\n")
    }

    sc.stop()

  }

}

你可能感兴趣的:(大数据,scala,spark,大数据)