PySpark:数据框:Numeric + Null 列值导致 NULL 而不是数值
Posted
技术标签:
【中文标题】PySpark:数据框:Numeric + Null 列值导致 NULL 而不是数值【英文标题】:PySpark : Dataframe : Numeric + Null column values resulting in NULL instead of numeric value 【发布时间】:2019-04-05 19:32:50 【问题描述】:我在从 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|
+-------------+------------+-----------+-----------+
将这些列转换为整数,所有空的都变为空
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|
+-------------+------------+-----------+-----------+
然后我要总计,但是如果其中一个为 null ,则结果也为 null。如何解决?
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|
+-------------+------------+-----------+-----------+-------------+
【问题讨论】:
用0填充空值。How to replace null values 【参考方案1】:您可以使用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()
我得到 total 为 null ,和你描述的一样 -
+----+----+-----+
| 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|
+----+----+-----+
【讨论】:
感谢 Pushkr 的反馈。但是,当通过加载文件创建数据框时它不起作用,但如果我们按照您上面给出的实用方式加载数据,它就会起作用。以上是关于PySpark:数据框:Numeric + Null 列值导致 NULL 而不是数值的主要内容,如果未能解决你的问题,请参考以下文章
如何将 pyspark 数据框列中的值与 pyspark 中的另一个数据框进行比较