首页 > 解决方案 > 从scala中的json字段中获取具有相同名称的列

问题描述

我有一个要求,我必须从 JSON 中的两列中选择一个城市,其中 city 存在键“City”。表中的第一个值出现为空,无法找到可能的解决方案

val jsonString="""{"Zipcode":704,"ZipCodeType":"STANDARD","City":"PARC PARQUE","State":"PR"}"""
    val data = Seq((1, jsonString))
    import spark.implicits._
    val df=data.toDF("id","value")
    df.show(false)


    import org.apache.spark.sql.types.{StringType, StructType}
    val schema = new StructType()
      .add("Zipcode", StringType, true)
      .add("ZipCodeType", StringType, true)
      .add("City", StringType, false)
      .add("City", StringType, true)


    val df4=df.withColumn("value",from_json(col("value"),schema))
    df4.printSchema()
    df4.show(false)

    val df5=df4.select(col("id"),col("value.*"))
    df5.printSchema()
    df5.show()

实际结果:

| id|Zipcode|ZipCodeType|City|       City|

|  1|    704|   STANDARD|null|PARC PARQUE|

预期结果:

| id|Zipcode|ZipCodeType|City|       City|

|  1|    704|   STANDARD|PARC PARQUE|PARC PARQUE|

标签: scaladataframeapache-spark

解决方案


我认为你在这里过于复杂了你的问题。只需使用 spark 内置函数就可以了。

我建议使用spark.read.json函数来进行处理。在这里,这就是我所做的。

val jsonStr = """{"Zipcode":704,"ZipCodeType":"STANDARD","City":"PARC PARQUE","State":"PR"}"""

import spark.implicits._
val df = spark.read.json(Seq(jsonStr).toDS) // this function has overloaded implementation as well so that you can also read json files directly from HDFS/S3

// if you do df.printSchema, it wonn't have a duplicate columns
df.printSchema

输出看起来像这样。如您所见,没有重复的 City 字段 输出


推荐阅读