如何从json字符串中提取值?

时间:2016-08-30 23:03:49

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

我有一个包含大量列的文件,一个名为jsonstring的列是字符串类型,其中包含json字符串...让我们说格式如下:

{
    "key1": "value1",
    "key2": {
        "level2key1": "level2value1",
        "level2key2": "level2value2"
    }
}

我想解析这个列,如下所示:jsonstring.key1,jsonstring.key2.level2key1返回value1,level2value1

我如何在scala或spark sql中执行此操作。

2 个答案:

答案 0 :(得分:6)

使用Spark 2.2,你可以使用函数from_json为你做JSON解析。

  

from_json(e:Column,schema:String,options:Map [String,String]):列将包含JSON字符串的列解析为StructType或{{1}具有指定模式的ArrayType

支持使用StructTypes(星号)展平嵌套列,这似乎是最佳解决方案。

*

答案 1 :(得分:1)

您可以使用withColumn + udf + json4s

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

def getJsonContent(jsonstring: String): (String, String) = {
    implicit val formats = DefaultFormats
    val parsedJson = parse(jsonstring)  
    val value1 = (parsedJson \ "key1").extract[String]
    val level2value1 = (parsedJson \ "key2" \ "level2key1").extract[String]
    (value1, level2value1)
}
val getJsonContentUDF = udf((jsonstring: String) => getJsonContent(jsonstring))

df.withColumn("parsedJson", getJsonContentUDF(df("jsonstring")))