【问题标题】:PySpark: Get first Non-null value of each column in dataframePySpark:获取数据框中每列的第一个非空值
【发布时间】:2017-10-08 04:16:40
【问题描述】:

我正在处理不同的 Spark DataFrames,它们在许多列中有很多 Null 值。我想从每一列中获取任何一个非空值,以查看该值是否可以转换为日期时间。

我尝试执行df.na.drop().first(),希望它会删除所有具有任何空值的行,而在剩余的DataFrame 中,我将只获得具有所有非空值的第一行。但是许多DataFrames 有很多包含大量空值的列,以至于df.na.drop() 返回空DataFrame

我还尝试查找是否有任何列具有所有 null 值,以便我可以在尝试上述方法之前简单地删除这些列,但这仍然没有解决问题。知道如何以有效的方式完成此任务,因为此代码将在巨大的 DataFrames 上运行多次?

【问题讨论】:

    标签: python apache-spark dataframe pyspark apache-spark-sql


    【解决方案1】:

    您可以将first 函数与ingorenulls 一起使用。假设数据如下所示:

    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: _() got an unexpected keyword argument 'ignorenulls'
    • 我使用的是 PySpark 1.6。 ignorenulls 不能用作参数。有什么解决方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多