如何在Spark中使用特定条件过滤 Dataframe

f0ofjuux  于 2022-11-16  发布在  Apache
关注(0)|答案(3)|浏览(198)

我有以下DF

Cod  Category  N
1    A         1 
1    A         2
1    A         3
1    B         1
1    B         2
1    B         3
1    B         4
1    B         5
2    D         1
3    Z         1
3    Z         2
3    Z         3
3    Z         4

我需要过滤这个DF,当N〉3时,那么这个类别的所有值都应该被检索到。我的预期输出是为了简化这个例子:

Cod  Category  N
1    B         1
1    B         2
1    B         3
1    B         4
1    B         5
3    Z         1
3    Z         2
3    Z         3
3    Z         4

如何实现这种类型的过滤器?我尝试使用窗口函数生成另一列,其中的Flag指示要进行过滤,但没有成功。

mspsb9vt

mspsb9vt1#

您可以使用窗口在每行关联其类别中存在的最大N。然后将条件应用于此新列以筛选类别。

w = Window.partitionBy("Cod", "Category")

df = df.withColumn("max_N_in_category", F.max("N").over(w))

N = 3
df = df \
    .filter(F.col("max_N_in_category") > N) \
    .drop("max_N_in_category")
67up9zun

67up9zun2#

数据类型

df =spark.createDataFrame([(1 ,   'A',         1 ),
(1  ,  'A' ,        2),
(1   , 'A'  ,       3),
(1    ,'B' ,        1),
(1  ,  'B' ,        2),
(1   , 'B' ,        3),
(1   , 'B' ,        4),
(1   , 'B' ,        5),
(2   , 'D' ,        1),
(3   , 'Z' ,        1),
(3   , 'Z'  ,       2)],
('Cod',  'Category',  'N'))



new = (df.withColumn('check', collect_list('N').over(Window.partitionBy('cod','Category')))#create array per group and keep in column check
       
       .where(expr("exists(check, c -> array_contains(check,3))"))#Filter arrays that do not contaiin 3
       .drop('check')#drop column check
      ).show()

结果

+---+--------+---+
|Cod|Category|  N|
+---+--------+---+
|  1|       A|  1|
|  1|       A|  2|
|  1|       A|  3|
|  1|       B|  1|
|  1|       B|  2|
|  1|       B|  3|
|  1|       B|  4|
|  1|       B|  5|
ctehm74n

ctehm74n3#

如果不想使用窗口函数,那么可以通过groupBy和filter with isin()来完成:

df.filter(df.Category.isin([x.Category for x in df.groupBy("Category").max("N").collect() if x["max(N)"] > 3]))

[Out]:
+---+--------+---+
|Cod|Category|  N|
+---+--------+---+
|  1|       B|  1|
|  1|       B|  2|
|  1|       B|  3|
|  1|       B|  4|
|  1|       B|  5|
|  3|       Z|  1|
|  3|       Z|  2|
|  3|       Z|  3|
|  3|       Z|  4|
+---+--------+---+

相关问题