【问题标题】:Drop duplicate attribute in json parsing in spark scala在 spark scala 中删除 json 解析中的重复属性
【发布时间】:2020-04-02 00:58:21
【问题描述】:

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

【问题讨论】:

  • 您确定这是一个有效的架构吗?数组的名称为空 "" 这不是 json 语法中的有效属性名称。您可以尝试使用 spark 解析给定的 json,如下所示stackoverflow.com/questions/38271611/…。 Spark 将忽略它,因为不允许使用空名称
  • 嗨 Alexandros,数组名称是地址。我没有输入我收到的完整 json。我刚刚提供了示例属性,我如何接收属性名称为“address1”和“Address1”,所以我想删除其中一个。

标签: json scala apache-spark jsonparser


【解决方案1】:
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()

【讨论】:

  • 为了使其通用,请将要删除的列传递给 drop 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2010-11-16
  • 2018-04-25
  • 1970-01-01
  • 2021-05-24
  • 2021-09-03
  • 2018-08-18
相关资源
最近更新 更多