簡體   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