#json #scala #apache-spark
#json #scala #apache-spark
Вопрос:
Я пытаюсь сделать какую-то плоскую карту в Spark (Scala) для RDD, который имеет N значений, а одно — в формате JSON.
Например, когда я печатаю RDD, у меня есть что-то похожее на это:
myRDD.collect().foreach(println)
[2020,{'COL_A': 1064.3667, 'col_B': 14534.2}]
[2020,{'COL_A': 1064.3667, 'col_B': 145.2}]
[2020,{'COL_A': 1064.3667, 'col_B': 15576.2}]
И я хотел бы иметь что-то вроде этого:
[2020,1064.3667,14534.2]
[2020,1064.3667,145.2]
[2020,1064.3667,15576.2]
Я не знаю, можно ли это сделать с помощью flatmap…
Спасибо!
Ответ №1:
Использование встроенной json4s
библиотеки для анализа json.
Импорт необходимых библиотек
scala> import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.JsonMethods._
scala> import org.json4s._
import org.json4s._
scala> val rdd = spark
.sparkContext
.parallelize(
Seq(
(2020,"""{"COL_A": 1064.3667, "col_B": 14534.2}"""),
(2020,"""{"COL_A": 1064.3667, "col_B": 145.2}"""),
(2020,"""{"COL_A": 1064.3667, "col_B": 15576.2}""")
)
)
scala> rdd.collect.foreach(println)
(2020,{"COL_A": 1064.3667, "col_B": 14534.2})
(2020,{"COL_A": 1064.3667, "col_B": 145.2})
(2020,{"COL_A": 1064.3667, "col_B": 15576.2})
scala> :paste
// Entering paste mode (ctrl-D to finish)
val transformedRdd = rdd.map { c =>
implicit val formats = DefaultFormats
val values = parse(c._2).extract[Map[String,Double]].values.toList
(c._1,values.head,values.last)
}
// Exiting paste mode, now interpreting.
scala> transformedRdd.collect.foreach(println)
(2020,1064.3667,14534.2)
(2020,1064.3667,145.2)
(2020,1064.3667,15576.2)