根据PySpark

时间:2016-03-09 12:17:18

标签: python sql apache-spark aggregate pyspark

我有一个PySpark DataFrame,我将其分组在一个字段(列)上,目的是为每个组删除具有另一个字段的特定值的记录。 例如,该表看起来像

colA    colB
'a'     1
'b'     1
'a'     0
'c'     0

这里我想要的是删除colA重复且colB为0的记录,以便获取

colA    colB
'a'     1
'b'     1
'c'     0
'p'的

行仍然是因为我只想删除重复的(在colA上)行的0。

我无法想出实现这一目标的方法,因为如果agg不是groupBy,我就不会精通在expr之后使用<asp:TextBox ID="contNoTxtBox" runat="server" Width="182px" style="height: 22px"></asp:TextBox> 的方式avg“,”max“等。

1 个答案:

答案 0 :(得分:3)

简单max怎么样?

from pyspark.sql.functions import max as max_

df = sc.parallelize([
  ('a', 1), ('b', 1), ('a', 0), ('c', 0)
]).toDF(('colA', 'colB'))

df.groupBy('colA').agg(max_('colB')).show()
## +----+---------+
## |colA|max(colB)|
## +----+---------+
## |   a|        1|
## |   b|        1|
## |   c|        0|
## +----+---------+

此方法适用于任何支持排序的列,并使用二进制标签,并可选择调整您使用的聚合函数(min / max)。

可以使用窗口函数实现更高级的规则,但它会更昂贵。

然而这是一个例子:

from pyspark.sql.functions import col, sum as sum_, when
from pyspark.sql import Window
import sys

w = Window.partitionBy("colA").rowsBetween(-sys.maxsize, sys.maxsize)

this_non_zero = col("colB") != 0
any_non_zero = sum_(this_non_zero.cast("long")).over(w) != 0

(df
  .withColumn("this_non_zero", this_non_zero)
   .withColumn("any_non_zero", any_non_zero)
   .where(
       (col("this_non_zero") & col("any_non_zero")) | 
       ~col("any_non_zero")
   ))