Realtime Compute for Apache Flink es compatible con las consultas SQL nativas de Apache Flink. La siguiente gramática en forma de Backus-Naur (BNF) define el superconjunto de consultas SQL de streaming y por lotes compatibles.
query:
values
| WITH withItem [ , withItem ]* query
| {
select
| selectWithoutFrom
| query UNION [ ALL ] query
| query EXCEPT query
| query INTERSECT query
}
[ ORDER BY orderItem [, orderItem ]* ]
[ LIMIT { count | ALL } ]
[ OFFSET start { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY]
withItem:
name
[ '(' column [, column ]* ')' ]
AS '(' query ')'
orderItem:
expression [ ASC | DESC ]
select:
SELECT [ ALL | DISTINCT ]
{ * | projectItem [, projectItem ]* }
FROM tableExpression
[ WHERE booleanExpression ]
[ GROUP BY { groupItem [, groupItem ]* } ]
[ HAVING booleanExpression ]
[ WINDOW windowName AS windowSpec [, windowName AS windowSpec ]* ]
selectWithoutFrom:
SELECT [ ALL | DISTINCT ]
{ * | projectItem [, projectItem ]* }
projectItem:
expression [ [ AS ] columnAlias ]
| tableAlias . *
tableExpression:
tableReference [, tableReference ]*
| tableExpression [ NATURAL ] [ LEFT | RIGHT | FULL ] JOIN tableExpression [ joinCondition ]
joinCondition:
ON booleanExpression
| USING '(' column [, column ]* ')'
tableReference:
tablePrimary
[ matchRecognize ]
[ [ AS ] alias [ '(' columnAlias [, columnAlias ]* ')' ] ]
tablePrimary:
[ TABLE ] tablePath [ dynamicTableOptions ] [systemTimePeriod] [[AS] correlationName]
| LATERAL TABLE '(' functionName '(' expression [, expression ]* ')' ')'
| [ LATERAL ] '(' query ')'
| UNNEST '(' expression ')'
tablePath:
[ [ catalogName . ] databaseName . ] tableName
systemTimePeriod:
FOR SYSTEM_TIME AS OF dateTimeExpression
dynamicTableOptions:
/*+ OPTIONS(key=val [, key=val]*) */
key:
stringLiteral
val:
stringLiteral
values:
VALUES expression [, expression ]*
groupItem:
expression
| '(' ')'
| '(' expression [, expression ]* ')'
| CUBE '(' expression [, expression ]* ')'
| ROLLUP '(' expression [, expression ]* ')'
| GROUPING SETS '(' groupItem [, groupItem ]* ')'
windowRef:
windowName
| windowSpec
windowSpec:
[ windowName ]
'('
[ ORDER BY orderItem [, orderItem ]* ]
[ PARTITION BY expression [, expression ]* ]
[
RANGE numericOrIntervalExpression {PRECEDING}
| ROWS numericExpression {PRECEDING}
]
')'
matchRecognize:
MATCH_RECOGNIZE '('
[ PARTITION BY expression [, expression ]* ]
[ ORDER BY orderItem [, orderItem ]* ]
[ MEASURES measureColumn [, measureColumn ]* ]
[ ONE ROW PER MATCH ]
[ AFTER MATCH
( SKIP TO NEXT ROW
| SKIP PAST LAST ROW
| SKIP TO FIRST variable
| SKIP TO LAST variable
| SKIP TO variable )
]
PATTERN '(' pattern ')'
[ WITHIN intervalLiteral ]
DEFINE variable AS condition [, variable AS condition ]*
')'
measureColumn:
expression AS alias
pattern:
patternTerm [ '|' patternTerm ]*
patternTerm:
patternFactor [ patternFactor ]*
patternFactor:
variable [ patternQuantifier ]
patternQuantifier:
'*'
| '*?'
| '+'
| '+?'
| '?'
| '??'
| '{' { [ minRepeat ], [ maxRepeat ] } '}' ['?']
| '{' repeat '}'
Identificadores
Las reglas de identificadores de Flink SQL difieren de Java en un aspecto importante: se permiten caracteres no alfanuméricos. En todos los demás aspectos, las reglas son las mismas que en Java:
Las definiciones de identificadores distinguen entre mayúsculas y minúsculas, independientemente de si el identificador está encerrado entre comillas inversas.
La coincidencia de identificadores distingue entre mayúsculas y minúsculas.
Ejemplo con un identificador no alfanumérico:
SELECT a AS `my field` FROM t
Constantes de cadena
Las constantes de cadena deben usar comillas simples ('), no comillas dobles (").
SELECT 'Hello World'
Para escapar una comilla simple dentro de una cadena, duplíquela:
Flink SQL> SELECT 'Hello World', 'It''s me';
+-------------+---------+
| EXPR$0 | EXPR$1 |
+-------------+---------+
| Hello World | It's me |
+-------------+---------+
1 row in set
Secuencias de escape Unicode
Para incluir valores Unicode en una constante de cadena, utilice el prefijo U& seguido de una secuencia de escape.
|
Método |
Sintaxis |
Ejemplo |
|
Escape predeterminado (barra invertida) |
|
|
|
Carácter de escape personalizado |
|
|
Consultas compatibles
La siguiente tabla enumera todas las consultas compatibles con Apache Flink 1.15. Para consultar la referencia de una versión diferente de Flink, cambie de versión en el sitio web de Apache Flink.
|
Consulta |
Referencia |
|
Hints |
|
|
Cláusula WITH |
|
|
Cláusulas SELECT y WHERE |
|
|
SELECT DISTINCT |
|
|
Funciones de ventana |
|
|
Agregación de ventana |
|
|
Agregación de grupo |
|
|
Agregación Over |
|
|
Join |
|
|
Window join |
|
|
Operaciones de conjuntos |
|
|
Cláusula ORDER BY |
|
|
Cláusula LIMIT |
|
|
Top-N |
|
|
Window Top-N |
|
|
Deduplicación |
|
|
Deduplicación de ventana |
|
|
Reconocimiento de patrones |
Ejecución de consultas
En modo streaming, los flujos de entrada se dividen en dos categorías:
Los flujos sin actualizaciones contienen únicamente eventos de tipo INSERT.
Los flujos con actualizaciones contienen otros tipos de eventos. Los orígenes de captura de datos de cambio (CDC) producen flujos con actualizaciones. Ciertas operaciones de Flink, como la agregación de grupo y Top-N, también generan eventos de actualización internamente.
La mayoría de las operaciones que producen eventos de actualización dependen de operadores con estado, los cuales utilizan estado gestionado para rastrear las actualizaciones. Sin embargo, no todos los operadores con estado aceptan flujos con actualizaciones como entrada. Por ejemplo, la agregación Over y el Interval Join no admiten flujos con actualizaciones como entrada.
La siguiente tabla describe las características de ejecución de cada consulta compatible. Esta información aplica a Ververica Runtime (VVR) 6.0.X y versiones posteriores.
| Consulta | Operador de ejecución | Usa datos de estado | Consume flujos con actualizaciones | Genera eventos de actualización | Notas |
|---|---|---|---|---|---|
| SELECT y WHERE | Calc | No | Sí | No | — |
| Lookup Join | LookupJoin | No* | Sí | No | Para VVR 8.0.1 y versiones posteriores: establecer table.optimizer.non-deterministic-update.strategy en TRY_RESOLVE habilita la resolución automática basada en estado de problemas de actualización no determinista. Establézcalo en IGNORE para deshabilitar el uso de estado. Cambiar este parámetro puede causar incompatibilidad y requerir la reejecución de la consulta. |
| Función de tabla | Correlate | No | Sí | No | — |
| SELECT DISTINCT | GroupAggregate | Sí | Sí | Sí | — |
| Agregación de grupo | GroupAggregate / LocalGroupAggregate / GlobalGroupAggregate / IncrementalGroupAggregate | Sí* | Sí | Sí | El operador de preagregación LocalGroupAggregate no utiliza datos de estado. |
| Agregación Over | OverAggregate | Sí | No | No | — |
| Agregación de ventana | GroupWindowAggregate / WindowAggregate / LocalWindowAggregate / GlobalWindowAggregate | Sí* | Sí* | No* | LocalWindowAggregate no utiliza datos de estado. La compatibilidad con flujos de actualización difiere entre VVR y Apache Flink; consulte la sección "Comparación de la compatibilidad con flujos de actualización" del tema Window aggregation para obtener más detalles. Si la función de disparo anticipado o tardío (experimental) está habilitada, se generan eventos de actualización. |
| Join (join regular) | Join | Sí | Sí | Sí* | Los joins externos (LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN) generan eventos de actualización. |
| Interval Join | IntervalJoin | Sí | No | No | — |
| Temporal Join | TemporalJoin | Sí | Sí | No | — |
| Window join | WindowJoin | Sí | No | No | — |
| Top-N | Rank | Sí | Sí | Sí | Top-N no admite clasificación por tiempo de procesamiento. Utilice funciones integradas como CURRENT_TIMESTAMP en su lugar. Aviso Especificar un campo de tiempo de procesamiento en la cláusula ORDER BY puede causar errores en los datos. Este problema no se reporta durante las verificaciones de sintaxis en VVR 8.0.7 y versiones anteriores. |
| Window Top-N | WindowRank | Sí | No | No | — |
| Deduplicación | Deduplicate | Sí | No | Sí* | El uso de la directiva Deduplicate Keep FirstRow con tiempo de procesamiento (Proctime) no genera eventos de actualización. |
| Deduplicación de ventana | WindowDeduplicate | Sí | No | No | — |
Los operadores sin estado transmiten los tipos de eventos sin modificarlos; los eventos de salida son del mismo tipo que los de entrada. Los operadores sin estado nunca generan eventos de actualización, independientemente de si la entrada es un flujo con actualizaciones.