PySpark:Dataframe:Numeric+;Null列值导致Null而不是数值

PySpark:Dataframe:Numeric+;Null列值导致Null而不是数值,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我在从CSV文件加载的PySpark Dataframe中遇到了一个问题,其中我的数字列确实有如下所示的空值 +-------------+------------+-----------+-----------+ | Player_Name|Test_Matches|ODI_Matches|T20_Matches| +-------------+------------+-----------+-----------+ | Aaron, V R| 9|

我在从CSV文件加载的PySpark Dataframe中遇到了一个问题,其中我的数字列确实有如下所示的空值

+-------------+------------+-----------+-----------+
|  Player_Name|Test_Matches|ODI_Matches|T20_Matches|
+-------------+------------+-----------+-----------+
|   Aaron, V R|           9|          9|           |
|  Abid Ali, S|          29|          5|           |
|Adhikari, H R|          21|           |           |
| Agarkar, A B|          26|        191|          4|
+-------------+------------+-----------+-----------+
将这些列强制转换为整数,所有这些空列变为null

df_data_csv_casted = df_data_csv.select(df_data_csv['Country'],df_data_csv['Player_Name'],                                        df_data_csv['Test_Matches'].cast(IntegerType()).alias("Test_Matches"),                                       df_data_csv['ODI_Matches'].cast(IntegerType()).alias("ODI_Matches"),                                         df_data_csv['T20_Matches'].cast(IntegerType()).alias("T20_Matches"))


+-------------+------------+-----------+-----------+
|  Player_Name|Test_Matches|ODI_Matches|T20_Matches|
+-------------+------------+-----------+-----------+
|   Aaron, V R|           9|          9|       null|
|  Abid Ali, S|          29|          5|       null|
|Adhikari, H R|          21|       null|       null|
| Agarkar, A B|          26|        191|          4|
+-------------+------------+-----------+-----------+
然后我取一个总数,但若其中一个为空,结果也为空。如何解决

df_data_csv_withTotalCol=df_data_csv_casted.withColumn('Total_Matches',(df_data_csv_casted['Test_Matches']+df_data_csv_casted['ODI_Matches']+df_data_csv_casted['T20_Matches']))

+-------------+------------+-----------+-----------+-------------+
|Player_Name  |Test_Matches|ODI_Matches|T20_Matches|Total_Matches|
+-------------+------------+-----------+-----------+-------------+
| Aaron, V R  |           9|          9|       null|         null|
|Abid Ali, S  |          29|          5|       null|         null|
|Adhikari, H R|          21|       null|       null|         null|
|Agarkar, A B |          26|        191|          4|          221|
+-------------+------------+-----------+-----------+-------------+

您可以使用
coalesce
函数解决此问题。例如,让我们创建一些示例数据

from pyspark.sql.functions import coalesce,lit

cDf = spark.createDataFrame([(None, None), (1, None), (None, 2)], ("a", "b"))
cDf.show()

+----+----+
|   a|   b|
+----+----+
|null|null|
|   1|null|
|null|   2|
+----+----+
当我像你一样做简单求和时-

cDf.withColumn('Total',cDf.a+cDf.b).show()
我得到的总数为空,和你描述的一样-

+----+----+-----+

|   a|   b|Total|
+----+----+-----+
|null|null| null|
|   1|null| null|
|null|   2| null|
+----+----+-----+
要修复此问题,请使用coalesce和lit函数,该函数将空值替换为零

cDf.withColumn('Total',coalesce(cDf.a,lit(0)) +coalesce(cDf.b,lit(0))).show()
这给了我正确的结果-

|   a|   b|Total|
+----+----+-----+
|null|null|    0|
|   1|null|    1|
|null|   2|    2|
+----+----+-----+

用0填充空值。感谢Pushkr的反馈。但是,当通过加载文件创建数据帧时,它不起作用,但是如果我们按照上面给出的方法实际加载数据,它就起作用了。