【问题标题】:flatten nested data structure in Spark展平 Spark 中的嵌套数据结构
【发布时间】:2019-10-31 19:20:49
【问题描述】:

我有以下数据框:

 df.show()
+--------------------+--------------------+----+--------+---------+--------------------+--------+--------------------+
|             address|         coordinates|  id|latitude|longitude|                name|position|                json|
+--------------------+--------------------+----+--------+---------+--------------------+--------+--------------------+
|Balfour St / Brun...|[-27.463431, 15.352472|79.0|    null|     null|79 - BALFOUR ST /...|    null|[-27.463431, 153.041031]|
+--------------------+--------------------+----+--------+---------+--------------------+--------+--------------------+

我想展平 json 列。 我做到了:

val jsonSchema  = StructType(Seq(
StructField("latitude", DoubleType, nullable = true),
StructField("longitude", DoubleType, nullable = true)))

val a = df.select(from_json(col("json"), jsonSchema) as "content")

但是

a.show() gives me :
+-------+
|content|
+-------+
|   null|
+-------+

知道如何正确解析 json col 并在第二个数据帧 (a) 中获取内容 col 不为 null 吗?

原始数据显示为:

{
    "id": 79,
    "name": "79 - BALFOUR ST / BRUNSWICK ST",
    "address": "Balfour St / Brunswick St",
    "coordinates": {
      "latitude": -27.463431,
      "longitude": 153.041031
    }
  }

非常感谢

【问题讨论】:

  • 您的 JSON 列值不清楚。你能分享一个示例 JSON 值和预期的输出吗?这会很有帮助
  • @BalajiReddy 完成请再次检查
  • 可以分享一下df的schema吗?

标签: json scala apache-spark


【解决方案1】:

问题是您的架构。您正在尝试访问嵌套集合值,如常规值。我对您的架构进行了更改,它对我有用。

val df = spark.createDataset(
  """
    |{
    |    "id": 79,
    |    "name": "79 - BALFOUR ST / BRUNSWICK ST",
    |    "address": "Balfour St / Brunswick St",
    |    "coordinates": {
    |      "latitude": -27.463431,
    |      "longitude": 153.041031
    |    }
    |  }
  """.stripMargin :: Nil)

val jsonSchema = StructType(Seq(
  StructField("name", StringType, nullable = true),

  StructField("coordinates",
    StructType(Seq(
      StructField("latitude", DoubleType, true)
      ,
      StructField("longitude", DoubleType, true)

    )), true)

)

)
val a = df.select(from_json(col("value"), jsonSchema) as "content")

a.show(false)

输出

+--------------------------------------------------------+
|content                                                 |
+--------------------------------------------------------+
|[79 - BALFOUR ST / BRUNSWICK ST,[-27.463431,153.041031]]|
+--------------------------------------------------------+

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2014-05-24
    • 2016-12-09
    • 1970-01-01
    • 2017-06-17
    • 2019-01-21
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多