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

anw*_*ian 4 python dataframe apache-spark apache-spark-sql pyspark

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

我尝试这样做df.na.drop().first()是希望它将所有具有空值的行都删除,其余的DataFrame将仅具有所有非空值的第一行。但是,DataFrames许多列中有很多列具有大量null值,因此df.na.drop()返回empty DataFrame

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

use*_*411 5

您可以将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
)
Run Code Online (Sandbox Code Playgroud)

您可以:

from pyspark.sql.functions import first

df.select([first(x, ignorenulls=True).alias(x) for x in df.columns]).first()
Run Code Online (Sandbox Code Playgroud)
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
)
Run Code Online (Sandbox Code Playgroud)