接上文:
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()
}
}