У меня есть искровой фреймворк, как показано ниже.

val df = Seq(("a",1,1400),("a",1,1250),("a",2,1200),("a",4,1250),("a",4,1200),("a",4,1100),("b",2,2500),("b",2,1250),("b",2,500),("b",4,250),("b",4,200),("b",4,100),("b",4,100),("b",5,800)).
toDF("id","hierarchy","amount")

Я работаю на языке Scala, чтобы использовать этот фрейм данных, и пытаюсь получить результат, как показано ниже.

val df = Seq(("a",1,1400),("a",4,1250),("a",4,1200),("a",4,1100),("b",2,2500),("b",2,1250),("b",4,250),("b",4,200),("b",4,100),("b",5,800)).
toDF("id","hierarchy","amount")

Правила: сгруппированы по идентификатору, если min (иерархия) == 1, я беру строку с наивысшим количеством , а затем перехожу к анализу иерархии> = 4 и беру 3 из них в порядке убывания суммы . С другой стороны, если min (иерархия) == 2, я беру две строки с наивысшим количеством , а затем перехожу к анализу иерархии> = 4 и беру 3 каждого из них в порядке убывания суммы . И так далее для всех идентификаторов в данных.

Спасибо за предложения ..

0
Rolando 23 Ноя 2021 в 07:56

1 ответ

Лучший ответ

Вы можете использовать оконные функции для генерации критериев, по которым вы будете фильтровать, например

val results = df.withColumn("minh",min("hierarchy").over(Window.partitionBy("id")))
                .withColumn("rnk",rank().over(Window.partitionBy("id").orderBy(col("amount").desc())))
                .withColumn(
                    "rn4",
                    when(col("hierarchy")>=4, row_number().over(
                     Window.partitionBy("id",when(col("hierarchy")>=4,1).otherwise(0)).orderBy(col("amount").desc())
                     ) ).otherwise(5)
                )
                .filter("rnk <= minh or rn4 <=3")
                .select("id","hierarchy","amount")

NB. Более подробный фильтр .filter("(rnk <= minh or rn4 <=3) and (minh in (1,2))")

Вышеуказанные временные столбцы, генерируемые оконными функциями для помощи в критериях фильтрации:

  • minh: используется для определения минимальной иерархии для идентификатора группы и последующего выбора максимального минимального количества столбцов из группы.
  • rnk используется для определения строк с наибольшим количеством в каждой группе
  • rn4 используется для определения строк с наибольшим количеством в каждой группе с иерархией> = 4
0
ggordon 23 Ноя 2021 в 08:27
 – 
ggordon
23 Ноя 2021 в 08:29