带有spark数据帧的null值和countDistinct

时间:2016-10-31 15:16:33

标签: apache-spark pyspark pyspark-sql

我有一个非常简单的数据框

  df = spark.createDataFrame([(None,1,3),(2,1,3),(2,1,3)], ['a','b','c'])

  +----+---+---+
  |   a|  b|  c|
  +----+---+---+
  |null|  1|  3|
  |   2|  1|  3|
  |   2|  1|  3|
  +----+---+---+

当我在此数据框上应用countDistinct时,根据方法会发现不同的结果:

第一种方法

  df.distinct().count()
  

2

结果我除外,最后两行是相同的,但第一行与另外两行不同(因为空值)

第二种方法

  import pyspark.sql.functions as F
  df.agg(F.countDistinct("a","b","c")).show()
  

1

似乎F.countDistinct处理null值的方式对我来说并不直观。

它看起来像是一个错误或正常吗?如果这是正常的,我怎么能写出与第一种方法完全相同但又与第二种方法相同的精神。

1 个答案:

答案 0 :(得分:4)

countDistinct的工作方式与Hive count(DISTINCT expr[, expr])相同:

  

count(DISTINCT expr [,expr]) - 返回提供的表达式唯一且非NULL的行数。

第一行不包括在内。这对于SQL函数来说很常见。