【问题标题】:Pyspark Count includes NullsPyspark 计数包括空值
【发布时间】:2023-03-21 20:35:02
【问题描述】:

运行一个简单的例子 -

dept = [("Finance",10),("Marketing",None),("Sales",30),("IT",40)]
deptColumns = ["dept_name","dept_id"]
rdd = sc.parallelize(dept)
df = rdd.toDF(deptColumns)
df.show(truncate=False)

print('count the dept_id, should be 3')
print('count: ' + str(df.select(F.col("dept_id")).count()))

我们得到以下输出 -

+---------+-------+
|dept_name|dept_id|
+---------+-------+
|Finance  |10     |
|Marketing|null   |
|Sales    |30     |
|IT       |40     |
+---------+-------+

count the dept_id, should be 3
count: 4

我在数据块上运行,这是我的堆栈 - Spark 3.0.1 Scala 2.12,DBR 7.3 LTS

感谢您的帮助!!

【问题讨论】:

    标签: pyspark


    【解决方案1】:

    Dataframe API 的 count 函数和 Spark SQL 的 count 函数之间存在细微差别。第一个只计算行数,而第二个可以忽略 null 值。

    您正在使用Dataframe.count()。根据文档,此功能

    返回此 DataFrame 中的行数

    所以结果 4 是正确的,因为数据框中有 4 行。

    如果应该忽略 null 值,您可以使用可以忽略 null 值的Spark SQL function count

    count(expr[, expr...]) - 返回提供的表达式都是非空的行数。

    例如

    df.selectExpr("count(dept_id)").show()
    

    返回3

    【讨论】:

    【解决方案2】:

    @werner 的另一个替代解决方案是使用 pyspark.sql.functions

    from pyspark.sql import functions as F
    
    print('count: ' + str(df.select(F.count(F.col("dept_id"))).collect()))
    

    【讨论】:

      【解决方案3】:

      您的代码不完整。也许你可以在 count() 之前添加 'isNotNull()'

      我的代码是这样的:

      from pyspark.sql.functions import col, count
      
      print('count the dept_id, should be 3')
      print('count: ' + str(df.filter(col("dept_id").isNotNull()).count()))
      

      【讨论】:

      • 代码应该计数 3 个条目(丢弃 null 条目),它计数为 4。也试过这个,它仍然计数为 4 ``` print('count in spark') print(df. select( F.when(F.col('dept_id').isNull(), True).otherwise(None) ).count()) ``
      • 我不想使用过滤器,因为它适用于 df 本身,我将在单个列的聚合函数中使用它,并且列上没有过滤器
      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2019-08-11
      • 2021-10-10
      • 2017-11-30
      相关资源
      最近更新 更多