PySpark 访问嵌套列在 PySpark 数据帧中
在本文中,我们将介绍如何在 PySpark 数据帧中访问嵌套列。PySpark 是 Apache Spark 的 Python API,可以用于处理大规模数据集的分布式计算。嵌套列是数据帧中包含其他结构的列,例如数组、字典或结构体。了解如何访问嵌套列对于处理复杂的数据结构和抽取需要的信息非常重要。
阅读更多:PySpark 教程
创建嵌套列的示例数据帧
我们首先创建一个包含嵌套列的示例数据帧。假设我们有一个包含客户信息的数据帧,其中包含客户的姓名、年龄和订单信息。订单信息是一个列表,其中包含订单的金额和日期。
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, struct, array
# 创建 SparkSession
spark = SparkSession.builder.getOrCreate()
# 示例数据
data = [("John", 28, [{"amount": 100, "date": "2022-01-01"}, {"amount": 200, "date": "2022-01-02"}]),
("Alice", 35, [{"amount": 150, "date": "2022-01-03"}, {"amount": 250, "date": "2022-01-04"}]),
("Bob", 42, [])]
# 创建数据帧
df = spark.createDataFrame(data, ["name", "age", "orders"])
# 显示数据帧
df.show(truncate=False)
输出结果如下所示:
+-----+---+--------------------------------+
|name |age|orders |
+-----+---+--------------------------------+
|John |28 |[[100, 2022-01-01], [200, 2022-01-02]]|
|Alice|35 |[[150, 2022-01-03], [250, 2022-01-04]]|
|Bob |42 |[] |
+-----+---+--------------------------------+
这个示例数据帧包含了客户的姓名、年龄和订单信息。订单信息是一个包含订单金额和日期的列表。现在我们将使用这个数据帧来演示如何访问嵌套列。
访问嵌套列的方法
PySpark 提供了几种方法来访问嵌套列。我们可以使用点表示法或方括号表示法来访问嵌套列的属性。下面是一些示例代码:
使用点表示法访问嵌套列
# 使用点表示法访问嵌套列的属性
df.select("name", "age", col("orders.amount").alias("order_amount"), col("orders.date").alias("order_date")).show(truncate=False)
输出结果如下所示:
+-----+---+--------------------------+-------------------+
|name |age|order_amount |order_date |
+-----+---+--------------------------+-------------------+
|John |28 |[100, 200] |[2022-01-01, 2022-01-02]|
|Alice|35 |[150, 250] |[2022-01-03, 2022-01-04]|
|Bob |42 |[] |[] |
+-----+---+--------------------------+-------------------+
使用点表示法,我们可以直接访问嵌套列的属性。在上面的示例中,我们使用点表示法访问订单金额和日期。
使用方括号表示法访问嵌套列
# 使用方括号表示法访问嵌套列的属性
df.select("name", "age", col("orders['amount']").alias("order_amount"), col("orders['date']").alias("order_date")).show(truncate=False)
输出结果如下所示:
+-----+---+------------+----------+
|name |age|order_amount|order_date|
+-----+---+------------+----------+
|John |28 |[100, 200] |[2022-01-01, 2022-01-02]|
|Alice|35 |[150, 250] |[2022-01-03, 2022-01-04]|
|Bob |42 |[] |[] |
+-----+---+------------+----------+
使用方括号表示法,我们可以通过列名的字符串形式来访问嵌套列的属性。
过滤嵌套列
除了访问嵌套列的属性,我们还可以使用过滤条件来筛选嵌套列的值。
# 筛选订单金额大于等于200的客户
df.filter(col("orders.amount") >= 200).show(truncate=False)
输出结果如下所示:
+-----+---+--------------------------------+
|name |age|orders |
+-----+---+--------------------------------+
|John |28 |[[100, 2022-01-01], [200, 2022-01-02]]|
|Alice|35 |[[150, 2022-01-03], [250, 2022-01-04]]|
+-----+---+--------------------------------+
在上面的示例中,我们使用过滤条件筛选了订单金额大于等于200的客户。
更新嵌套列
我们还可以使用 withColumn 函数来更新嵌套列的值。
# 将订单金额增加100
df.withColumn("orders.amount", col("orders.amount") + 100).show(truncate=False)
输出结果如下所示:
+-----+---+--------------------------------+
|name |age|orders |
+-----+---+--------------------------------+
|John |28 |[[200, 2022-01-01], [300, 2022-01-02]]|
|Alice|35 |[[250, 2022-01-03], [350, 2022-01-04]]|
|Bob |42 |[] |
+-----+---+--------------------------------+
在上面的示例中,我们使用 withColumn 函数将订单金额增加了100。
总结
本文介绍了如何在 PySpark 数据帧中访问嵌套列。我们通过创建一个包含嵌套列的示例数据帧来演示了访问、过滤和更新嵌套列的方法。掌握这些技巧可以帮助我们处理复杂的数据结构,并从中提取所需的信息。通过使用点表示法或方括号表示法,我们可以轻松地访问嵌套列的属性。使用过滤条件,我们可以筛选嵌套列的值。通过使用 withColumn 函数,我们可以更新嵌套列的值。希望本文能帮助您更好地理解和应用 PySpark 中的嵌套列操作。
极客笔记