Apache spark Pyspark上的逻辑条件-何处与何时聚合

Apache spark Pyspark上的逻辑条件-何处与何时聚合,apache-spark,pyspark,Apache Spark,Pyspark,有人能给我解释一下为什么这两个条件会产生不同的输出(甚至不同的count()) 第一: (df .where(cond1) .where((cond2) | (cond3)) .groupBy('id') .agg(F.avg(F.column('col1')).alias('name'), F.avg(F.column('col2')).alias('name')) ).count() 第二: (df .groupBy('id') .agg(F.avg(F.when(

有人能给我解释一下为什么这两个条件会产生不同的输出(甚至不同的count())

第一:

(df
 .where(cond1)
 .where((cond2) | (cond3))
 .groupBy('id')
 .agg(F.avg(F.column('col1')).alias('name'),
      F.avg(F.column('col2')).alias('name'))
).count()
第二:

(df
 .groupBy('id')
 .agg(F.avg(F.when(((cond2) | (cond3))) & (cond1),
                   F.column('col1'))).alias('name'),
      F.avg(F.when(((cond2) | (cond3)) & (cond1),
                   F.column('col2'))).alias('name'))
).count()

我刚想出来。when()在未找到匹配项时返回None,但None仍然是返回值,这意味着聚合将考虑所有值。与由同一列分组的简单df相比,结果是相同的,只是在没有条件的情况下进行聚合


另一方面,where()过滤数据帧,因此聚合只应用于数据帧的过滤版本,因此在不知道条件是什么的情况下,结果数量较少,我的理解是它们是不同的过程:在第一种情况下,您首先过滤需要处理的行,按id分组并获得过滤数据的平均值,结果是x行。在第二种情况下,首先按id分组,不进行行过滤,然后告诉spark添加一个名为“name”的列,该列将条件平均值保存到分组的df中。您不需要有条件地筛选行,因此现在您有x+更多行(取决于您的条件)

但是:


希望这能有所帮助(我想你已经明白了:)。祝你好运

因为过滤过程完全不同。@RameshMaharjan嗯,这毫无意义。首先过滤,然后应用聚合应该和对过滤后的值子集应用聚合一样好,不是吗。。。?你能详细解释一下它们为什么不同吗?谢谢!是的,这正是我的困惑,我会看看如何回避这个问题,尽管我认为最简单的解决办法是使用a。否则(1),对吗?因为这是一个平均值的聚合?嗯,不确定最终结果需要是什么,但如果需要获得与第一种方法相同的结果,
否则
听起来是个不错的选择(如果不需要,可以过滤掉
否则
值)。
(df
 .where(cond1)              # remove rows by applying cond1
 .where((cond2) | (cond3))  # remove rows by applying cond2, 3
 .groupBy('id')             # group *remaining* rows by id
 .agg(F.avg(F.column('col1')).alias('name'), # then get the average
      F.avg(F.column('col2')).alias('name'))
).count()
(df
 .groupBy('id')  # group initial data by id
 .agg(F.avg(F.when(((cond2) | (cond3))) & (cond1), # add a column to the grouped data that computes average conditionally
                   F.column('col1'))).alias('name'),
      F.avg(F.when(((cond2) | (cond3)) & (cond1),
                   F.column('col2'))).alias('name'))
).count()

# the agg does not change the number of the rows.