2016-09-14 50 views
0

我正在研究一个正在接受JSON消息并需要解析它的Spark Streaming应用程序。它有两部分,但部分JSON解析在测试时似乎是更大的开销。有什么办法可以优化吗?优化Scala JSON解析

import scala.util.parsing.json.JSON 

val parsed = JSON.parseFull(formatted) 
val subject = parsed.flatMap(_.asInstanceOf[Map[String, String]].get("subject")).toString.drop(5).dropRight(1) 
val predicate = parsed.flatMap(_.asInstanceOf[Map[String, String]].get("predicate")).toString.drop(5).dropRight(1) 
val obj = parsed.flatMap(_.asInstanceOf[Map[String, String]].get("object")).toString.drop(5).dropRight(1) 
val label = parsed.flatMap(_.asInstanceOf[Map[String, String]].get("label")).toString.drop(5).dropRight(1) 
val url = "http://" + elasticAddress.value + "/data/quad/" 
val urlEncoded = java.net.URLEncoder.encode(label + subject + predicate + obj, "utf-8") 
+1

parsed.flatMap(_ asInstanceOf [地图[字符串,字符串]]是越来越重复,可以计算和重复使用 – Samar

+0

可以解析被重用,因为。?。 – theMadKing

+0

是的,在应用地图后执行计算得到的值 – Samar

回答

0

您是否也在项目中使用Play框架?如果是这样的话,the Play JSON library绝对可以减少代码的数量,使其更具可读性(例如可以轻松地将代码转换为具有匹配结构的case class),但我并不知道从效率的角度来看它会如何优化您的东西。

+0

我一直在使用json4s,我想我会切换到。 – theMadKing

0

我已经改成了这样:

import org.json4s.JsonAST.{JField, JObject, JString, JArray, JValue} 
import org.json4s.jackson.JsonMethods. 

     val parsed = parse(data) 
     val output: List[(String, String, String, String)] = for { 
      JArray(sys) <- parsed 
      JObject(child) <- sys 
      JField("subject", JString(subject)) <- child 
      JField("predicate", JString(predicate)) <- child 
      JField("object", JString(obj)) <- child 
      JField("label", JString(label)) <- child 
     } yield (subject, predicate,obj, label) 
     val subject = output(0)._1 
     val predicate = output(0)._2 
     val obj = output(0)._3 
     val label = output(0)._4