2016-09-14 4 views
0

Я работаю над приложением Spark Streaming, которое принимает сообщение JSON и нуждается в его анализе. Он состоит из двух частей, но часть анализа JSON, по-видимому, является более сложной задачей при тестировании. Есть ли способ оптимизировать это?Оптимизация Scala JSON Parsing

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 [Карта [String, String]] становится повторен Может быть вычислен и повторно – 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