![](/img/trans.png)
[英]Parse & flatten JSON object in a text file using Spark & Scala into Dataframe
[英]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.轉換成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.