2016-09-14 74 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