Todos os produtos
Search
Central de documentação

Realtime Compute for Apache Flink:HOP

Última atualização: Jun 27, 2026

Use a função HOP na cláusula GROUP BY para definir uma janela deslizante (hopping window) no Flink SQL. Cada evento pode pertencer simultaneamente a várias janelas sobrepostas, o que torna a função HOP ideal para calcular agregações móveis — por exemplo, contar cliques por usuário no último minuto, com recálculo a cada 30 segundos.

Sintaxe

HOP(<time-attr>, <slide-interval>, <size-interval>)

Parâmetros

Parâmetro

Descrição

Exemplo

<time-attr>

Coluna de atributo de tempo no fluxo. Define se o sistema usará tempo de evento ou tempo de processamento. Para mais informações, consulte Atributos de tempo.

<slide-interval>

Frequência de avanço da janela. Determina a diferença de tempo entre o início de janelas consecutivas. Formato: INTERVAL 'num' timeUnit.

INTERVAL '10' SECOND — a janela avança a cada 10 segundos

<size-interval>

Duração total abrangida por cada janela. Formato: INTERVAL 'num' timeUnit.

INTERVAL '5' MINUTE — cada janela abrange 5 minutos

Comportamento de sobreposição de janelas

A relação entre <slide-interval> e <size-interval> determina como as janelas se sobrepõem:

Condição

Comportamento

slide-interval < size-interval

As janelas se sobrepõem. O sistema atribui cada evento a múltiplas janelas. Este é o padrão clássico de janela deslizante.

slide-interval = size-interval

As janelas são contíguas, sem intervalos — equivalente a janelas saltitantes (tumbling windows).

slide-interval > size-interval

Não há sobreposição; as janelas ficam separadas por lacunas temporais.

Funções identificadoras de janela

Use estas funções na cláusula SELECT para obter o horário inicial, final ou o atributo de tempo de uma janela.

Função

Tipo de retorno

Descrição

HOP_START(<time-attr>, <slide-interval>, <size-interval>)

TIMESTAMP

Horário inicial da janela (inclusivo). Por exemplo, retorna 00:10 para a janela [00:10, 00:15].

HOP_END(<time-attr>, <slide-interval>, <size-interval>)

TIMESTAMP

Horário final da janela (inclusivo). Por exemplo, retorna 00:15 para a janela [00:00, 00:15].

HOP_ROWTIME(<time-attr>, <slide-interval>, <size-interval>)

TIMESTAMP (rowtime-attr)

Horário final da janela (exclusivo). Por exemplo, retorna 00:14:59.999 para a janela (00:00, 00:15). Retorna um atributo rowtime utilizável em operações de janela subsequentes. Use apenas em janelas baseadas em tempo de evento. Para mais detalhes, veja Janelas em cascata.

HOP_PROCTIME(<time-attr>, <slide-interval>, <size-interval>)

TIMESTAMP (rowtime-attr)

Horário final da janela (exclusivo). Por exemplo, retorna 00:14:59.999 para a janela (00:00, 00:15). Fornece um atributo de tempo de processamento para uso em operações de janela posteriores. Use apenas em janelas baseadas em tempo de processamento. Consulte também Janelas em cascata.

Exemplo

Este exemplo conta cliques por usuário em uma janela deslizante de 1 minuto que avança a cada 30 segundos. A consulta usa HOP_START e HOP_END para recuperar os limites da janela.

Dados de teste (user_clicks)

username (VARCHAR)

click_url (VARCHAR)

eventtime (VARCHAR)

Jark

http://taobao.com/xxx

2024-10-10 10:00:00.0

Jark

http://taobao.com/xxx

2024-10-10 10:00:10.0

Jark

http://taobao.com/xxx

2024-10-10 10:00:49.0

Jark

http://taobao.com/xxx

2024-10-10 10:01:05.0

Jark

http://taobao.com/xxx

2024-10-10 10:01:58.0

Timo

http://taobao.com/xxx

2024-10-10 10:02:10.0

SQL

CREATE TEMPORARY TABLE user_clicks (
  username VARCHAR,
  click_url VARCHAR,
  eventtime VARCHAR,
  ts AS TO_TIMESTAMP(eventtime),
  WATERMARK FOR ts AS ts - INTERVAL '2' SECOND  -- Define a watermark for the rowtime.
) WITH (
  'connector' = 'kafka',
  'topic' = '<yourTopic>',
  'properties.bootstrap.servers' = '<brokers>',
  'scan.startup.mode' = 'earliest-offset',
  'format' = 'csv'
);

CREATE TEMPORARY TABLE hop_output (
  window_start TIMESTAMP,
  window_end TIMESTAMP,
  username VARCHAR,
  clicks BIGINT
) WITH (
  'connector' = 'print',
  'logger' = 'true'
);

INSERT INTO hop_output
SELECT
    HOP_START(ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE),
    HOP_END(ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE),
    username,
    COUNT(click_url)
FROM user_clicks
GROUP BY HOP(ts, INTERVAL '30' SECOND, INTERVAL '1' MINUTE), username;

Resultados

window_start (TIMESTAMP)

window_end (TIMESTAMP)

username (VARCHAR)

clicks (BIGINT)

2024-10-10 09:59:30.0

2024-10-10 10:00:30.0

Jark

2

2024-10-10 10:00:00.0

2024-10-10 10:01:00.0

Jark

3

2024-10-10 10:00:30.0

2024-10-10 10:01:30.0

Jark

2

2024-10-10 10:01:00.0

2024-10-10 10:02:00.0

Jark

2

2024-10-10 10:01:30.0

2024-10-10 10:02:30.0

Jark

1

2024-10-10 10:01:30.0

2024-10-10 10:02:30.0

Timo

1

① Horário inicial da primeira janela

Se a janela deslizante não conseguir determinar o momento exato em que o primeiro evento entrou no fluxo, ela desloca o início da primeira janela para trás conforme a fórmula: duração da janela - passo de deslizamento.

Veja o exemplo:

Duração da janela (segundos)

Passo de deslizamento (segundos)

Tempo do evento

Início da primeira janela

Fim da primeira janela

120

30

2024-07-31 10:00:00.0

2024-07-31 09:58:30.0

2024-07-31 10:00:30.0

60

10

2024-07-31 10:00:00.0

2024-07-31 09:59:10.0

2024-07-31 10:00:10.0

② Janela ainda não disparada

A linha com window_end = 2024-10-10 10:02:30.0 não aparece nos resultados porque a janela ainda não foi acionada. O disparo ocorre quando:

event time >= window_end + watermark offset

Por exemplo: 10:02:30.0 + 2 seconds = 10:02:32.0. Qualquer evento de qualquer usuário ocorrido em ou após 10:02:32.0 aciona essa janela.