首页 > 解决方案 > 从spark中的json中的数组中提取Json

问题描述

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

故事{卡片:[{故事元素:[{...}{...}{...}}]}

故事元素的长度是可变的。我需要从故事元素数组中提取一个特定的 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")))

标签: jsonscalaapache-sparkapache-spark-sql

解决方案


根据您提供的 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]]List[String]


推荐阅读