【问题标题】:Counting nulls or zeros in PySpark data frame with struct column types使用结构列类型计算 PySpark 数据框中的空值或零值
【发布时间】:2023-03-16 00:05:01
【问题描述】:

我有一个 PySpark 数据框,它混合了整数列、字符串列和结构列。结构列可以是结构,但也可以只是null。例如:

id | mystring   |  mystruct |
-------------------------- 
1  | something  | <struct>|
2  | something  | null    |
3  | 0          | null    |
4  | something  | null    |
5  | something  | <struct> |

是否有任何简单的方法可以遍历整个数据框并获取 null/na/0 值的计数,而不必分解结构列?例如,我想要上面的

id | mystring   |  mystruct |
-------------------------- 
0  | 1          | 3

我见过一些不同的方法,但它们似乎总是对结构类型抛出错误,我宁愿不必单独执行它们。

【问题讨论】:

标签: python dataframe pyspark


【解决方案1】:

这不是一个简单的方法,但您可以定义一个函数来处理每一列的nulls(所有输入类型)和nans/zeros(用于数字输入)。然后你可以分别加入每一列的结果。

from pyspark.sql import *
from pyspark.sql.functions import *
from pyspark import SparkContext, SparkConf
from pyspark.sql.types import *
from pyspark.sql.functions import monotonically_increasing_id

conf = SparkConf()
sc = SparkContext(conf=conf)
spark = SparkSession(sc)

# setup
data = [[1, {'f':[1,2,3]}], [2, None],[0, None], [1, None], [3, {'f':[1]}]]
schema = StructType([
    StructField('mynum', IntegerType(), True), 
    StructField('mystruct', 
        StructType([StructField('f', ArrayType(IntegerType()), True)]), True)
    ])
rdd = spark.sparkContext.parallelize(data)
df = spark.createDataFrame(rdd, schema)

def get_nulls_nans_zeros(c, df):
    # all inputs
    val = df.select(count(when(isnull(c), c)).alias(c))
    t = type(df.schema[c].dataType)
    # numeric inputs
    if t in [ByteType, ShortType, IntegerType, LongType, FloatType, DoubleType, DecimalType]:
        val = val.union(df.select(count(when(isnan(c), c)).alias(c)))
        val = val.union(df.select(count(when(col(c) == 0, c)).alias(c)))
    return val.select(sum(c).alias(c))

# Get and merge results for each column
res = [get_nulls_nans_zeros(c, df) for c in df.columns]
res = [r.withColumn("id", monotonically_increasing_id()) for r in res]
result = res[0].join(res[1], "id", "outer").drop("id")
result.show()

如果您使用的是 Spark 3.1+,您还可以使用 unionByName 中的 allowMissingColumns 标志来完成最后一部分,而不必通过单调递增的 id 加入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多