从Spark中的json内的数组中提取Json

时间:2018-07-05 10:53:39

标签: json scala apache-spark apache-spark-sql

我有一个复杂的JSON列,其结构是:

  

故事{   卡:[{story-elements:[{...} {...} {...}}]}

故事元素的长度是可变的。我需要从story-elements数组中提取特定的JSON块。为此,我首先需要提取故事元素。

这是我尝试过的代码,但是给出了错误:

import org.json4s.{DefaultFormats, MappingException}
import org.json4s.jackson.JsonMethods._
import org.apache.spark.sql.functions._

def getJsonContent(jsonstring: String): (String) = {
implicit val formats = DefaultFormats
val parsedJson = parse(jsonstring)
val value1 = (parsedJson\"cards"\"story-elements").extract[String]
value1
}
val getJsonContentUDF = udf((jsonstring: String) => 
getJsonContent(jsonstring))

input.withColumn("cards",getJsonContentUDF(input("storyDataFrame")))

1 个答案:

答案 0 :(得分:0)

根据您提供的json,story-elements是json对象的数组,但是您尝试将数组提取为字符串((parsedJson\"cards"\"story-elements").extract[String])。

您可以创建代表故事的案例类(例如case class Story(description: String, pageUrl: String, ...)),然后尝试使用extract[String]extract[List[Story]]代替extract[Array[Story]] 如果您只需要故事中的一条数据(例如描述),则可以使用类似xpath的语法来获取该数据,然后提取List[String]