首页 > 解决方案 > 在 spark scala 中删除 json 解析中的重复属性

问题描述

我正在解析 json 文件,并且我有一个属性会出现两次。所以我想删除一个属性,这样我就可以避免模棱两可的错误。这是示例 json。例如,address1 和 Address1 具有相同的值,但唯一的区别是第一个字符是大写字母。所以我想从 spark scala 中的 json 解析中删除其中一个。

{
    "ID": 1,
    "case": "12",
    "addresses": {
        "": [{
            "address1": "abc",
            "address2": "bkc",
            "Address1": "abc",
            "Address2": "bk"
        }, {
            "address1": "ede",
            "address2": "ak",
            "Address1": "ede",
            "Address2": "ak"
        }]
    },
    "FirstName": "abc",
    "LastName": "cvv"
}

当我们在 spark scala 中进行 json 解析时,有人可以指导我如何删除其中一个。我需要自动化这意味着现在我们面临地址问题,并且将来一些其他属性可能是类似的问题。因此,我们可能需要为面临类似问题的所有情况寻找解决方案,而不是对其进行硬编码。

标签: jsonscalaapache-sparkjsonparser

解决方案


val jsonString = """
{
    "ID": 1,
    "case": "12",
    "addresses": [{
    "address1": "abc",
    "address2": "bkc",
    "Address1": "abc",
    "Address2": "bk"
    }, {
    "address1": "ede",
    "address2": "ak",
    "Address1": "ede",
    "Address2": "ak"
    }],
    "FirstName": "abc",
    "LastName": "cvv"
}
"""
val jsonDF = spark.read.json(Seq(jsonString).toDS)


import org.apache.spark.sql.functions._

//Add this before using drop
sqlContext.sql("set spark.sql.caseSensitive=true")

jsonDF.withColumn("Addresses", explode(col("addresses")))
  .selectExpr("Addresses.*", "ID","case","FirstName","LastName")
  .drop("address1","address2")
  .show()

推荐阅读