繁体   English   中英

在 Scala/Spark 中将 JSON 结构解析为 JSON 对象

[英]Parse a JSON struct as a JSON object in Scala / Spark

我在我的 MongoDB 集合中存储了一个巨大的 JSON 字符串列表。 为简单起见,我将示例文档提取到文本文件businessResource.json

{
   "data" : {
        "someBusinessData" : {
            "capacity" : {
                "fuelCapacity" : NumberLong(282)
            },
            "someField" : NumberLong(16),
            "anotherField" : {
                "isImportant" : true,
                "lastDateAndTime" : "2008-01-01T11:11",
                "specialFlag" : "YMA"
            },
   ...
}

我的问题:如何使用 Spark/Scala 将“someBusinessData”转换为 JSON 对象?

如果我这样做(例如使用 json4s 或lift-json),我希望我可以对它们执行基本操作,例如检查它们是否相等。

请记住,这是一个相当大的 JSON 对象。 就我而言,创建案例类是不值得的,因为我将执行的唯一操作是对两个字段进行一些过滤,比较文档是否相等,然后我将再次导出它们。

这是我获取数据的方式:

 val df: DataFrame = (someSparkSession).sqlContext.read.json("src/test/resources/businessResource.json")

 val myData: DataFrame = df.select("data.someBusinessData")
 myData.printSchema

该架构显示:

root
 |-- someBusinessData: struct (nullable = true)
 |    |-- capacity: struct (nullable = true)

由于“someBusinessData”是一个结构,我无法将其作为字符串获取。 当我尝试使用myData.first.getStruct(0)打印时,我得到一个包含值但不包含键的字符串: [[[282],16,[true,2008-01-01T11:11,YMA]

谢谢你的帮助!

而不是使用.json使用.textFile读你的JSON文件。

  • 然后我们将rdd转换为dataframe (将只有一个字符串列)。

Example:

//read json file as textfile and create df

val df=spark.sparkContext.textFile("<json_file_path>").toDF("str")

//use get_json_object function to traverse json string
df.selectExpr("""get_json_object(str,"$.data.someBusinessData")""").show(false)

//+-----------------------------------------------------------------------------------------------------------------------------------------------------+
//|get_json_object(str,$.data.someBusinessData)                                                                                                         |
//+-----------------------------------------------------------------------------------------------------------------------------------------------------+
//|{"capacity":{"fuelCapacity":"(282)"},"someField":"(16)","anotherField":{"isImportant":true,"lastDateAndTime":"2008-01-01T11:11","specialFlag":"YMA"}}|
//+-----------------------------------------------------------------------------------------------------------------------------------------------------+

事实上,我的帖子包含两个问题:

  1. 如何使用 Spark/Scala 将“someBusinessData”转换为 JSON 对象?
  2. 如何将 JSON 对象作为字符串获取?

1.转换成JSON对象

我在做什么,已经创建了一个可以作为 JSON 对象导航的 DataFrame:

//read json file as Json and select the needed data
val df: DataFrame = sparkSession.sqlContext.read.json(filePath).select("data.someBusinessData")

如果你做.textFile你正确地得到字符串,但解析 JSON 你然后需要求助于 Shu 的答案。

2. 如何以字符串的形式获取 JSON 对象?

琐碎:

    df.toJSON.first

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM