как фильтровать в зависимости от значения после группировки в спарк - PullRequest
0 голосов
/ 21 апреля 2020

допустим, у меня есть следующий фрейм данных:

val a=Seq(("aa","b",1),("aa","c",5),("aa","d",0),("xx","y",5),("z","zz",9),("z","b",12)).toDF("name","tag","num").show
+----+---+---+
|name|tag|num|
+----+---+---+
|  aa|  b|  1|
|  aa|  c|  5|
|  aa|  d|  0|
|  xx|  y|  5|
|   z| zz|  9|
|   z|  b| 12|
+----+---+---+

Я хочу отфильтровать этот фрейм данных так, чтобы:

для каждой группы данных (сгруппированных по имени), если у тега column есть значение 'b'. Я возьму максимальное значение столбца num, в противном случае я игнорирую строку

. Вот выход, который я хочу получить:

+----+---+---+
|name|tag|num|
+----+---+---+
|  aa|  c|  5|
|   z|  b| 12|
+----+---+---+

Пояснение

  • группа строк с именем = 'aa' имеет строку, в которой значение тега == 'b', то есть I ' m принимает максимальное число num этой группы, которое составляет 5.
  • группа строк с именем = 'xx' не имеет строки, в которой значение тега == 'b', таким образом, это w
  • группа строк с именем = 'z' имеет строку, в которой значение тега == 'b', поэтому я беру максимальное значение num этой группы, равное 12.

1 Ответ

1 голос
/ 21 апреля 2020

Попробуйте это:

val df=Seq(("aa","b",1),("aa","c",5),("aa","d",0),("xx","y",5),("z","zz",9),("z","b",12)).toDF("name","tag","num")
df.createOrReplaceTempView("tab")

val res = spark.sql(""" with tw as (select t1.name, max(t1.num) as max_val
                          from tab t1 
                         where t1.name in (select distinct t2.name 
                                             from tab t2
                                            where t2.tag = 'b'
                                          )
                      group by t1.name )
                      select distinct tz.name, tz.tag, tz.num
                        from tab tz, tw
                       where tz.name = tw.name
                         and tz.num  = tw.max_val
                   """) 
res.show(false)
...