Как написать SQL для расчета на основе добавочного окна пакетной таблицы

Мое требование состоит в том, чтобы вычислить на основе окна добавочного размера для пакетной таблицы.

Например, первое окно имеет 1 строку, второе окно имеет 2 строки (включая 1 строку из 1-го окна и новую строку), затем 3 строки в 3-м окне (включая 2 строки из 2-го окна и новую строку) , и так далее.

Например:

Исходная таблица:

дата и время | идентификатор продукта | цена |

3-1 | p1 | 10 |

3-2 | p1 | 20 |

3-3 | p1 | 30 |

3-4 | p1 | 40 |

Таблица результатов:

дата и время | идентификатор продукта | средний|

3-1 | p1 | 10/1 |

3-2 | p1 | (10+20)/2 |

3-3 | p1 | (10+20+30)/3 |

3-4 | p1 | (10+20+30+40)/4 |

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

Кстати:

Я попытался использовать окно TUMBLE на 1 день и сохранить предыдущее значение в определяемом пользователем объекте агрегации, но не удалось, так как объект агрегации будет повторно использоваться всеми продуктами, а не отдельными объектами для каждого продукта


person yinhua    schedule 26.03.2018    source источник
comment
Почему вы говорите, что OVER еще не реализовано? Насколько я знаю, это так. И я думаю, что это будет работать в этом случае.   -  person Dawid Wysakowicz    schedule 26.03.2018
comment
Я имел в виду OVER в пакетном окне   -  person yinhua    schedule 27.03.2018


Ответы (1)


Предложение OVER в пакетной таблице еще не поддерживается SQL Flink. Вы можете отслеживать статус этой попытки здесь.

Однако не рассматривали ли вы вместо этого реализацию этого поведения на таблице потоковой передачи? Потоковые таблицы также могут считываться из статических файлов, таких как файлы CSV, и там также поддерживаются многие операции. Однако это зависит от других операций, которые вы хотите использовать в своем запросе.

person twalthr    schedule 26.03.2018
comment
Спасибо, я постараюсь проверить, есть ли у потоковой передачи все функции для моего приложения. - person yinhua; 27.03.2018
comment
Выглядит невыполнимым, мне нужно объединить две таблицы. - person yinhua; 27.03.2018
comment
Есть ли какой-либо другой обходной путь, например игра с пользовательской функцией, чтобы решить эту проблему? - person yinhua; 27.03.2018
comment
Соединения будут доступны в версии 1.5 для потоковой передачи, но, возможно, не так эффективно, как в пакетном режиме. Вы можете попробовать функцию агрегации (вы группировали по идентификатору продукта?). В противном случае я думаю, что вам нужно сделать это с API DataSet на данный момент. - person twalthr; 27.03.2018
comment
Да, я группирую по productId и пытался сохранить предыдущий результат расчета в функции агрегации, но это не работает, так как объект накопления используется повторно, а также я видел, что окно не рассчитывается с временным порядком, когда параллелизм больше 1 - person yinhua; 27.03.2018