首页 > 解决方案 > 在 Spark Dataframe 中交换列值,其中一个是字符串,另一个是结构内的字符串

问题描述

我在数据框中有如下数据

{"A", {4,"B"}}

架构:

{"type":"struct","fields":[{"name":"lastname","nullable":false,"type":"string","metadata":{}},{"name":"name","type":{"type":"struct","fields":[{"name":"mid","type":"long","nullable":true,"metadata":{}},{"name":"firstname","type":"string","nullable":true,"metadata":{}}]},"nullable":true,"metadata":{}}]}

我想交换值“A”和“B”,以便输出如下所示

{"B", {4,"A"}}

我们可以在不使用 map 之类的函数的情况下实现这一点吗?在Java中可以用withColumn、select来实现吗?我想避免使用任何行级操作,例如 map,因为我们需要将编码器传递给这些函数,并且由于某些限制,我无法传递编码器。

df.show()

+--------+------+
|lastname|  name|
+--------+------+
|       A|[4, B]|
|       C|[5, D]|
+--------+------+

df.printSchema()

root
 |-- lastname: string (nullable = false)
 |-- name: struct (nullable = true)
 |    |-- mid: long (nullable = true)
 |    |-- firstname: string (nullable = true)

标签: apache-sparkapache-spark-sql

解决方案


您可以简单地使用selectstruct如下

df.select($"name.firstName".as("lastName"),
  struct("name.mid", "lastName").as("name")
).show(false)

输出:

+--------+------+
|lastName|name  |
+--------+------+
|B       |{4, A}|
|D       |{5, C}|
+--------+------+

推荐阅读