PySpark:Spark fillNa方法不替换null值

PySpark:Spark fillNa方法不替换null值

在本文中,我们将介绍PySpark中的fillNa方法以及它在处理null值时的行为。fillNa方法是Spark DataFrame API中的一个常用方法,用于替换DataFrame中的null值。我们将详细了解该方法的使用,并通过示例说明其行为。

阅读更多:PySpark 教程

fillNa方法介绍

fillNa方法用于替换DataFrame中的null值。它可以接收一个字典或一个值,用于指定替换哪些列及用什么值进行替换。当传入一个字典时,字典的键表示要替换的列名,值表示要替换的值。当传入一个值时,该值将被用于替换所有列中的null值。

示例说明

假设我们有一个用于存储销售订单信息的DataFrame,其中包含了订单ID、客户ID、销售额和销售日期等字段。有些字段可能包含null值,我们希望将这些null值替换为合适的值。

首先,让我们创建一个示例DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, DoubleType

# 创建SparkSession
spark = SparkSession.builder.appName("FillNaExample").getOrCreate()

# 定义架构
schema = StructType([
    StructField("order_id", IntegerType()),
    StructField("customer_id", IntegerType()),
    StructField("sales_amount", DoubleType()),
    StructField("sales_date", StringType())
])

# 创建示例数据
data = [
    (1, 1001, 100.0, "2022-01-01"),
    (2, None, 200.0, "2022-01-02"),
    (3, 1003, None, "2022-01-03"),
    (4, 1004, 400.0, None)
]

# 创建DataFrame
df = spark.createDataFrame(data, schema)
df.show()

上述代码创建了一个DataFrame,包含了四个字段:order_id(订单ID)、customer_id(客户ID)、sales_amount(销售额)和sales_date(销售日期)。

DataFrame显示如下:

+--------+-----------+------------+----------+
|order_id|customer_id|sales_amount|sales_date|
+--------+-----------+------------+----------+
|       1|       1001|       100.0|2022-01-01|
|       2|       null|       200.0|2022-01-02|
|       3|       1003|        null|2022-01-03|
|       4|       1004|       400.0|      null|
+--------+-----------+------------+----------+

接下来,我们可以使用fillNa方法来替换null值。假设我们希望将所有null值替换为0:

filled_df = df.fillna(0)
filled_df.show()

替换后的DataFrame如下所示:

+--------+-----------+------------+----------+
|order_id|customer_id|sales_amount|sales_date|
+--------+-----------+------------+----------+
|       1|       1001|       100.0|2022-01-01|
|       2|          0|       200.0|2022-01-02|
|       3|       1003|         0.0|2022-01-03|
|       4|       1004|       400.0|         0|
+--------+-----------+------------+----------+

可以看到,所有的null值都被替换为了0。

除了使用固定值进行替换,我们还可以传入一个字典来指定不同列使用不同的替换值。例如,我们希望将销售额为null的行的销售额替换为平均销售额,将客户ID为null的行的客户ID替换为最常见的客户ID:

filled_df = df.fillna({"sales_amount": df.select("sales_amount").agg({"sales_amount": "mean"}).first()[0],
                       "customer_id": df.select("customer_id").groupBy("customer_id").count().orderBy("count", ascending=False).first()[0]})
filled_df.show()

替换后的DataFrame如下所示:

+--------+-----------+------------+----------+
|order_id|customer_id|sales_amount|sales_date|
+--------+-----------+------------+----------+
|       1|       1001|       100.0|2022-01-01|
|       2|       1001|       200.0|2022-01-02|
|       3|       1003|       250.0|2022-01-03|
|       4|       1004|       400.0|      null|
+--------+-----------+------------+----------+

总结

本文介绍了PySpark中fillNa方法的使用,以及在处理null值时的行为。我们学习了填充固定值和使用字典进行复杂填充的示例。通过合理使用fillNa方法,我们可以更好地处理DataFrame中的null值,使数据清洗工作更加高效和准确。希望本文对您了解和使用fillNa方法有所帮助。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程