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方法有所帮助。
极客教程