PySpark:获取数据框中每列的第一个非空值

6
我正在处理不同的Spark DataFrames,其中许多列都有很多空值。我想从每个列中获取任何一个非空值,以查看该值是否可以转换为日期时间。
我尝试使用df.na.drop().first(),希望它会删除所有具有任何空值的行,并且在剩余的DataFrame中,我将只获取所有非空值的第一行。但是,许多DataFrames有许多包含很多空值的列,因此df.na.drop()返回空的DataFrame
我还尝试找到是否有任何列都具有所有null值,以便我可以在尝试上述方法之前简单地删除该列,但这仍然没有解决问题。有什么好的办法可以高效地完成此操作?因为这段代码将在大型DataFrames上运行多次。
1个回答

11

您可以在 ignorenulls 的情况下使用 first 函数。假设数据如下:

from pyspark.sql.types import StringType, StructType, StructField

schema = StructType([
    StructField("x{}".format(i), StringType(), True) for i in range(3)
])

df = spark.createDataFrame(
    [(None, "foo", "bar"), ("foo", None, "bar"), ("foo", "bar", None)],
    schema
)

您可以:

from pyspark.sql.functions import first

df.select([first(x, ignorenulls=True).alias(x) for x in df.columns]).first()

Row(x0='foo', x1='foo', x2='bar')

这个不起作用。我得到了这个错误: TypeError:_()得到了一个意外的关键字参数'ignorenulls' - anwartheravian
1
我正在使用PySpark 1.6。ignorenulls不可用作参数。有什么解决方法吗? - anwartheravian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接