Size: a a a

2021 February 12

ПФ

Паша Финкельштейн... in Moscow Spark
Ща, момент
источник

ПФ

Паша Финкельштейн... in Moscow Spark
collect_list работает, это уже то, от чего оттолкнуться можно
источник

GT

Gennady Timofeev in Moscow Spark
Паша Финкельштейн
Не-не, у меня как раз фиксированного размера окно
Делаешь окно по своему ключу и по значению колонки (с той же сортировкой). Нумеруешь роу намбером, отнимаешь 1
источник

NB

Nikita Bakanchev in Moscow Spark
Паша Финкельштейн
Ща я пример набросаю
(1, "a"),
(2, "b"),
(3, "a")
,
(4, "a"),

Хочу добавить колонку, в которой будет написано сколько раз на предыдущих двух строках встретилась строка из второй колонки
WITH t as  (
   
Select 1 as a, 'a' as b
   
UNION ALL
    Select
2 as a, 'b'as b
   
UNION ALL
    Select
3 as a, 'a' as b
UNION ALL
   select
4 as a, 'a' as b
union all
    select
5 as a, 'a' as b
)

select t1.a, t1.b, count(t2.a)
 
from t t1
 
left
 join
t t2
   
on t1.b = t2.b
 
and t1.a > t2.a
 
and t1.a - 2 <= t2.a
group by t1.a, t1.b
источник

А

Алексей in Moscow Spark
Nikita Bakanchev
WITH t as  (
   
Select 1 as a, 'a' as b
   
UNION ALL
    Select
2 as a, 'b'as b
   
UNION ALL
    Select
3 as a, 'a' as b
UNION ALL
   select
4 as a, 'a' as b
union all
    select
5 as a, 'a' as b
)

select t1.a, t1.b, count(t2.a)
 
from t t1
 
left
 join
t t2
   
on t1.b = t2.b
 
and t1.a > t2.a
 
and t1.a - 2 <= t2.a
group by t1.a, t1.b
тоже вариант, надо только выбрать, что лучше будет по плану и скорости
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Нашёл
источник

ПФ

Паша Финкельштейн... in Moscow Spark
val win = Window.orderBy($"_1").rowsBetween(-2, -1)
df.withColumn("tst", collect_list($"_2").over(win)).withColumn("tst2", size(expr("filter(tst, x -> x == _2)")))
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Оконные функции — козлы
источник

А

Алексей in Moscow Spark
Паша Финкельштейн
Оконные функции — козлы
почему?
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Алексей
почему?
Потому что блин нет простых путей сделать кучу вещей, которые должны делать просто
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Почему я не могу просто представить окно как таблицу и сделать на ней произвольные операции?
источник

ПФ

Паша Финкельштейн... in Moscow Spark
И в итоге фильтр листа — это не функция, а какой-то непонятный суррогат
источник

M

Mi in Moscow Spark
Особенности реализации?
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Наверное да )
источник

M

Mi in Moscow Spark
Хотя все равно каждое окно это отдельный стейдж
источник

А

Алексей in Moscow Spark
Паша Финкельштейн
И в итоге фильтр листа — это не функция, а какой-то непонятный суррогат
не знаю, есть еще диалект mdx в классических бд, для обращения к данным а-ля эксель таблицы, но они еще более мозговыносящие.
Возможно будет читаемей код через join, который выше предлагали
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Блиииин, а есть совсем другой путь — .partitionBy(_2).orderBy(_1).rowsBetween(-2,1)
и там делать count(*), очень похоже на то, что писали @SLASH_CyberPunk и @space_hero а я не понял по скудоумию своему
источник

ПФ

Паша Финкельштейн... in Moscow Spark
    SELECT  *,
           COUNT(*) OVER(PARTITION BY _2 ORDER BY _1
                         RANGE BETWEEN 2 PRECEDING AND CURRENT ROW
                         ) -1 AS count
   FROM    table
   ORDER BY ID
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Сначала партишн, потом ордер просто сделают нам окошки совсем маленькими
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Всем спасибо, TIL
источник