我是apachespark新手,我正在尝试比较两个json文件。我的要求是找出哪个键/值被添加、删除或修改,以及它的路径是什么。
为了解释我的问题,我在这里用一个小json示例来分享我尝试过的代码。
示例json 1是:
{
“员工”:{
“name”:“索诺”,
“工资”:57000,
“已婚”:没错
} }
示例json 2是:
{
“员工”:{
“name”:“索诺”,
“工资”:58000,
“已婚”:没错
} }
我的代码是:
//Compare two multiline json files
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
//Load first json file
val jsonData_1 = sqlContext.read.json(sc.wholeTextFiles("D:\\File_1.json").values)
//Load second json file
val jsonData_2 = sqlContext.read.json(sc.wholeTextFiles("D:\\File_2.json").values)
//Compare both json files
jsonData_2.except(jsonData_1).show(false)
我在执行这段代码时得到的输出是:
+--------------------+
|employee |
+--------------------+
|{true, sonoo, 58000}|
+--------------------+
但是这里只有一个字段,即salary被修改了,所以输出应该只是带有路径的更新字段。
以下是预期输出的详细信息:
[
{
"op" : "replace",
"path" : "/employee/salary",
"value" : 58000
}
]
有人能给我指出正确的方向吗?
1条答案
按热度按时间x3naxklr1#
假设每个json都有一个标识符,并且您有两个json组(例如文件夹),您需要比较两个组中的json:
将每个组的json加载到一个Dataframe中,提供一个与子结构匹配的模式。在此之后,您有两个Dataframe。
通过连接标识符来比较json(现在是Dataframe中的行),寻找不匹配的值。