scala 解析json字符串 scala 两种方法实现单词计数

来源:互联网 发布:centos 移除文件 编辑:程序博客网 时间:2024/06/03 09:25
scala中自带了一个

scala.util.parsing.json.JSON

然后可以通过JSON.parseFull(jsonString:String)来解析一个json字符串,如果解析成功的话则返回一个Some(map: Map[String, Any]),如果解析失败的话返回None。

所以我们可以通过模式匹配来处理解析结果:

[plain] view plain copy
  1. val str2 = "{\"et\":\"kanqiu_client_join\",\"vtm\":1435898329434,\"body\":{\"client\":\"866963024862254\",\"client_type\":\"android\",\"room\":\"NBA_HOME\",\"gid\":\"\",\"type\":\"\",\"roomid\":\"\"},\"time\":1435898329}"  
  2.   
  3. val b = JSON.parseFull(str2)  
  4. b match {  
  5.   // Matches if jsonStr is valid JSON and represents a Map of Strings to Any  
  6.   case Some(map: Map[String, Any]) => println(map)  
  7.   case None => println("Parsing failed")  
  8.   case other => println("Unknown data structure: " + other)  

  1. }  



  1. val lines = List("hello world", "hello spark")  
  2.    val wordlist = lines.flatMap(line => line.split(" ")).map(word => (word, 1))  
  3.    //方法一:先groupBy再map  
  4.    wordlist.groupBy(_._1).map {  
  5.      case (word, list) => (word, list.size)  
  6.    }.foreach(println)  
  7.   
  8.    //方法二:通过aggregate来实现map reduce,效率更高  
  9.    val seqop = (result: mutable.HashMap[String, Int], wordcount: (String, Int)) => {  
  10.      val addOne = (wordcount._1, result.getOrElse(wordcount._1, 0) + wordcount._2)  
  11.      result.+=(addOne)  
  12.    }  
  13.    val combop = (result1: mutable.HashMap[String, Int], result2: mutable.HashMap[String, Int]) => {  
  14.      result1 ++= result2  
  15.    }  
  16.    val result = wordlist.aggregate(mutable.HashMap[String, Int]())(seqop,combop)  
  17.    println(result)  

从文件读取进行word count:

[plain] view plain copy
  1. val lines = Source.fromFile("test.txt").getLines()  
  2.  val seqop = (result: mutable.HashMap[String, Int], line: String) => {  
  3.    val wordcount = line.replace(",", " ").replace(".", " ").replace("(", " ").replace(")", " ").split(" ").filter(_.trim.length > 0).map(word => (word, 1))  
  4.    wordcount.foreach(wc => {  
  5.      val addOne = (wc._1, result.getOrElse(wc._1, 0) + wc._2)  
  6.      result += addOne  
  7.    })  
  8.    result  
  9.  }  
  10.  val combop = (result1: mutable.HashMap[String, Int], result2: mutable.HashMap[String, Int]) => {  
  11.    result1 ++= result2  
  12.  }  
  13.   
  14.  val test = lines.aggregate(mutable.HashMap[String, Int]())(seqop, combop)  
  15.  println(test)  

lines其实是一个迭代器,流式一行一行读取,不要toList,否则读取大文件时可能出现内存溢出问题

原创粉丝点击