PySpark 如何将嵌套的Struct列展开成多个列

PySpark 如何将嵌套的Struct列展开成多个列

在本文中,我们将介绍如何使用PySpark将嵌套的Struct列展开成多个列。嵌套的Struct列是一种常见的数据结构,其中包含了多个字段。有时候,我们需要将这些字段展开成多个独立的列,以便进行更方便的数据分析和处理。

首先,让我们创建一个包含嵌套的Struct列的示例数据集。假设我们有一个包含学生姓名、年龄和地址的数据集,其中地址是一个嵌套的Struct列,包含街道、城市和邮政编码。以下是示例数据集的结构:

+--------+---+------------------------------+
|  姓名  | 年龄 |            地址            |
+--------+---+------------------------------+
|   张三  | 25 | [长安街, 北京市, 100000] |
|   李四  | 30 | [南京路, 上海市, 200000] |
|   王五  | 28 | [东大街, 广州市, 300000] |
+--------+---+------------------------------+
Python

我们想要将地址展开为独立的三个列:街道、城市和邮政编码。接下来,我们将使用PySpark来实现这个目标。

阅读更多:PySpark 教程

使用selectExpr方法展开嵌套的Struct列

PySpark中的DataFrame提供了一个selectExpr方法,可以用来选择和转换列。我们可以使用该方法来展开嵌套的Struct列。以下是使用selectExpr方法展开地址的示例代码:

from pyspark.sql import SparkSession

# 创建SparkSession
spark = SparkSession.builder.getOrCreate()

# 创建示例数据集
data = [("张三", 25, ("长安街", "北京市", 100000)),
        ("李四", 30, ("南京路", "上海市", 200000)),
        ("王五", 28, ("东大街", "广州市", 300000))]

df = spark.createDataFrame(data, ["姓名", "年龄", "地址"])

# 使用selectExpr方法展开嵌套的Struct列
df.selectExpr("姓名", "年龄", "地址._1 as 街道", "地址._2 as 城市", "地址._3 as 邮编").show()
Python

运行以上代码,输出结果如下:

+----+---+-----+------+------+------+
|姓名|年龄|街道|城市|邮政编码|
+----+---+-----+------+------+------+
| 张三 | 25| 长安街 | 北京市 |100000|
| 李四 | 30| 南京路 | 上海市 |200000|
| 王五 | 28| 东大街 | 广州市 |300000|
+----+---+-----+------+------+------+
Python

从上面的输出结果可以看到,原先的地址列被展开成了三个独立的列:街道、城市和邮政编码。

使用withColumn方法展开嵌套的Struct列

除了使用selectExpr方法,我们还可以使用withColumn方法来展开嵌套的Struct列。通过withColumn方法,我们可以将新的列添加到DataFrame中。

以下是使用withColumn方法展开地址的示例代码:

# 使用withColumn方法展开嵌套的Struct列
df = df.withColumn("街道", df["地址"].getItem("_1")) \
       .withColumn("城市", df["地址"].getItem("_2")) \
       .withColumn("邮编", df["地址"].getItem("_3")) \
       .drop("地址")

df.show()
Python

运行以上代码,输出结果与前面的示例相同。

使用explode方法展开嵌套的Array列

有时候,嵌套的Struct列内部可能还包含了Array列。如果我们需要展开嵌套的Array列,可以使用explode方法。该方法可以将Array列的每个元素展开成独立的行。

以下是使用explode方法展开嵌套的Array列的示例代码:

from pyspark.sql.functions import explode

# 创建示例数据集
data = [("张三", 25, [("北京市", 100000), ("上海市", 200000)]),
        ("李四", 30, [("上海市", 200000), ("广州市", 300000)])]

df = spark.createDataFrame(data, ["姓名", "年龄", "地址"])

# 使用explode方法展开嵌套的Array列
df = df.withColumn("地址", explode(df["地址"]))

# 展开后的结果
df.show()
Python

运行以上代码,输出结果如下:

+----+---+--------+
|姓名|年龄|  地址  |
+----+---+--------+
| 张三 | 25| 北京市,100000 |
| 张三 | 25| 上海市,200000 |
| 李四 | 30| 上海市,200000 |
| 李四 | 30| 广州市,300000 |
+----+---+--------+
Python

从上面的输出结果可以看到,嵌套的Array列被展开成了独立的行。

总结

本文介绍了如何使用PySpark将嵌套的Struct列展开成多个独立的列。我们可以使用selectExpr方法或withColumn方法来实现这个目标。另外,对于嵌套的Array列,我们可以使用explode方法来展开。通过展开嵌套的Struct列,我们可以更方便地进行数据处理和分析。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册