[英]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.