scala—从具有键值对的列中获取部分值,并将其赋给spark dataframe中的新列

nszi6y05  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(489)

我有一个数据框如下

+----+-----------------------------+
|id  | att                         |
+----+-----------------------------+
| 25 | {"State":"abc","City":"xyz"}|
| 26 | null                        |
| 27 | {"State":"pqr"}             |
+----+-----------------------------+

如果att列具有city属性else null,则我需要一个具有列id和city的Dataframe

+----+------+
|id  | City | 
+----+------+
| 25 | xyz  |
| 26 | null |
| 27 | null |
+----+------+

语言:scala

watbbzwu

watbbzwu1#

您可以使用from\ json来解析json数据并将其转换为map。然后使用以下方法之一访问Map项:
column类的getitem方法
默认访问器,即 map("map_key") 功能元件

import org.apache.spark.sql.functions.from_json
import org.apache.spark.sql.types.{MapType, StringType}

import sparkSession.implicits._
val df = Seq(
  (25, """{"State":"abc","City":"xyz"}"""),
  (26, null),
  (27, """{"State":"pqr"}""")
).toDF("id", "att")

val schema = MapType(StringType, StringType)

df.select($"id", from_json($"att", schema).getItem("City").as("City"))

//or df.select($"id", from_json($"att", schema)("City").as("City"))
//or df.select($"id", element_at(from_json($"att", schema), "City").as("City"))

// +---+----+
// | id|City|
// +---+----+
// | 25| xyz|
// | 26|null|
// | 27|null|
// +---+----+

相关问题