оконная функция для получения наивысшего ранга не работает должным образом, давая дублирующиеся записи - PullRequest
0 голосов
/ 05 мая 2020

Я использую в своем проекте spark- sql -2.4.1v.

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

Я использую приведенный ниже фрагмент кода, чтобы найти уникальные записи, т. Е. Ранг-1.

val ws = Window.partitionBy("company_id").orderBy(desc("created_date"))

val rankDs =  sourceDs.withColumn("rank",rank().over(ws))
                                      .where($"rank".===(lit(1)))
                                      .select("*")

Результаты, которые он показывает:

+-------------+-----------+----+
| created_date| company_id|rank|
+-------------+-----------+----+
|   2018-02-01|   17869354|   1|
|   2018-02-01|   17869354|   1|
|   2018-02-01|   41248792|   1|
|   2018-02-01|   41248792|   1|
|   2018-02-01|   86947653|   1|
|   2018-02-01|   86947653|   1|
--------------------------------

Как показано выше, он дает повторяющиеся записи для нескольких исходных записей, так что здесь не так, как это исправить т.е. давать только записи ранга 1 без дубликатов?

Ожидаемый результат:

+-------------+-----------+----+
| created_date| company_id|rank|
+-------------+-----------+----+
|   2018-02-01|   17869354|   1|
|   2018-02-01|   41248792|   1|
|   2018-02-01|   86947653|   1|
--------------------------------

1 Ответ

1 голос
/ 05 мая 2020

Вместо rank используйте оконную функцию row_number(), чтобы получить уникальные записи без дубликатов.

val ws = Window.partitionBy("company_id").orderBy(desc("created_date"))

val rankDs =  sourceDs.withColumn("row_number",row_number().over(ws))
                                      .where($"row_number".===(lit(1)))
                                      .select("*")
//result
//+------------+----------+---+----------+
//|created_date|company_id| no|row_number|
//+------------+----------+---+----------+
//|  2018-02-01|  86947653|  1|         1|
//|  2018-02-01|  41248792|  1|         1|
//|  2018-02-01|  17869354|  1|         1|
//+------------+----------+---+----------+
...