pyspark.sql.functions.greatest函数对丢失数据的不同处理

时间:2018-09-03 14:05:00

标签: pandas pyspark-sql

我使用的是Spark 2.2.0,想了解greatest函数如何处理丢失的数据。

但是,我有两种矛盾的情况。

import pandas as pd
import pyspark.sql.functions as F

df_pd = pd.DataFrame(
    data={
        'a': [1, 2, 3],
        'b': [-1.0, 0.5, 2.7],
        'c': [3, None, 1]})
df1 = spark.createDataFrame(df_pd)

df2 = spark.createDataFrame([(1, -1.0, 3), (2, 0.5, None), (3, 2.7, 1)], ['a', 'b', 'c'])


df1.withColumn('max', F.greatest(F.col('a'), F.col('b'), F.col('c'))).show()
df2.withColumn('max', F.greatest(df2.a, df2.b, df2.c)).show()

第一个产生这个:

+---+----+---+---+
|  a|   b|  c|max|
+---+----+---+---+
|  1|-1.0|3.0|3.0|
|  2| 0.5|NaN|NaN|
|  3| 2.7|1.0|3.0|
+---+----+---+---+

而第二个:

+---+----+----+---+
|  a|   b|   c|max|
+---+----+----+---+
|  1|-1.0|   3|3.0|
|  2| 0.5|null|2.0|
|  3| 2.7|   1|3.0|
+---+----+----+---+

关于为什么发生这种情况的任何想法?理想情况下,我希望跳过空值,并且在测试时偶然发现了这一点。

1 个答案:

答案 0 :(得分:0)

第一个spark数据帧是使用panda数据帧创建的,其中没有一个被转换为Nan,这是缺失数据的panda api的默认转换。

在第二种情况下,您将Spark API与原始数据一起使用,并且对于丢失的数据始终将其转换为null

在python中,空对象不代表任何对象。您不能在python中使用null而不是不使用