首页 > 解决方案 > 火花数据框无法替换 NULL 值

问题描述

下面的代码工作正常,但如果任何一个字段NULL超出 5 列SAL1, SAL2, SAL3, SAL4, SAL5,则对应的字段TOTAL_SALARYNULL. 看起来需要创建一些空条件或火花 udf,请您帮忙。

输入:

NO NAME ADDR SAL1 SAL2 SAL3 SAL4 SAL5
1  ABC  IND  100  200  300  null 400
2  XYZ  USA  200  333  209  232  444

第二条记录的总和很好,但在第一条记录中由于 null in SAL4,输出也为 null。

from pyspark.shell import spark
from pyspark.sql import functions as F
from pyspark.sql.types import StringType
sc = spark.sparkContext

df = spark.read.option("header","true").option("delimiter", ",").csv("C:\\TEST.txt")
df.createOrReplaceTempView("table1")
df1 = spark.sql( "select * from table1" )
df2 = df1.groupBy('NO', 'NAME', 'ADDR').agg(F.sum(df1.SAL1 + df1.SAL2 + df1.SAL3 + df1.SAL4 + df1.SAL5).alias("TOTAL_SALARY"))
df2.show()

提前致谢

标签: apache-sparkpysparkapache-spark-sqlpyspark-sql

解决方案


只需na.fill(0)在您的代码中添加一个。这会将 NULL 值替换为 0,您应该能够执行该操作。

所以你的最后一行应该是这样的:

df2 = df1.na.fill(0).groupBy('NO', 'NAME', 'ADDR').agg(F.sum(df1.SAL1 + df1.SAL2 + df1.SAL3 + df1.SAL4 + df1.SAL5).alias("TOTAL_SALARY"))

该函数似乎也sum应该能够正确处理 Null 值。我刚刚测试了以下代码:

df_new = spark.createDataFrame([
(1, 4), (2, None),  (3,None), (4,None),
(5,5), (6,None), (7,None),(1, 4), (2, 8),  (3,9), (4,1),(1, 2), (2, 1), (3,3), (4,7),
], ("customer_id", "balance"))
df_new.groupBy("customer_id").agg(sum(col("balance"))).show()
df_new.na.fill(0).groupBy("customer_id").agg(sum(col("balance"))).show()

输出:

+-----------+------------+
|customer_id|sum(balance)|
+-----------+------------+
|          7|        null|
|          6|        null|
|          5|           5|
|          1|          10|
|          3|          12|
|          2|           9|
|          4|           8|
+-----------+------------+
+-----------+------------+
|customer_id|sum(balance)|
+-----------+------------+
|          7|           0|
|          6|           0|
|          5|           5|
|          1|          10|
|          3|          12|
|          2|           9|
|          4|           8|
+-----------+------------+

如果总和中的所有值都为 NULL,则版本 1 仅包含 NULL 值。版本 2 返回 0,因为所有 NULL 值都替换为 0


推荐阅读