MULTI_KEYVALUE es una función de tabla que extrae varios valores de una cadena con formato de clave-valor en una sola llamada. Esta función divide la cadena en pares de clave-valor mediante el delimitador especificado por split1, separa cada par en una clave y un valor con el delimitador indicado por split2 y devuelve los valores correspondientes a las claves solicitadas.
Compatible con Realtime Compute for Apache Flink a partir de Ververica Runtime (VVR) 3.0.0.
Sintaxis
MULTI_KEYVALUE(VARCHAR str, VARCHAR split1, VARCHAR split2, VARCHAR key_name1, VARCHAR key_name2, ...)
Dado que MULTI_KEYVALUE es una función de tabla, debe invocarse mediante una unión lateral table:
SELECT c1, c2
FROM T1, lateral table(MULTI_KEYVALUE(str, split1, split2, key1, key2))
as T(c1, c2);
Parámetros
|
Parámetro |
Tipo |
Descripción |
|
|
|
La cadena que se va a analizar sintácticamente. |
|
|
|
El delimitador de pares de clave-valor. Si es |
|
|
|
El delimitador entre clave y valor. Si es |
|
|
|
Las claves cuyos valores se desean obtener. Agregue tantos argumentos de clave como sean necesarios. |
Cuándo utilizar KEYVALUE en su lugar
En VVR 8.0.7 y versiones anteriores, utilice la función escalar KEYVALUE en lugar de MULTI_KEYVALUE en cualquiera de las siguientes situaciones:
Todos los valores de
split1,split2y cada argumentokey_nameson cadenas constantes.Dentro de un espacio de nombres que ejecuta una versión específica del motor,
MULTI_KEYVALUEse invoca varias veces con distintos delimitadoressplit1ysplit2, ya sea en el mismo despliegue o en varios. CuandoKEYVALUEanaliza diferentes nombres de clave del mismo campo en llamadas repetidas, Flink reutiliza los resultados intermedios del análisis y aplica un mecanismo de análisis binario, lo que mejora la eficiencia general del procesamiento. Dado queKEYVALUEes una función escalar, debe invocarse una vez por cada clave.
Ejemplo
Uso básico
Analice sintácticamente k1=v1;k2=v2 con ; como delimitador de pares y = como delimitador de clave-valor:
-- Input: str = 'k1=v1;k2=v2', split1 = ';', split2 = '='
SELECT c1, c2
FROM T1, lateral table(MULTI_KEYVALUE(str, split1, split2, 'k1', 'k2'))
as T(c1, c2);
-- Output: c1 = 'v1', c2 = 'v2'
Referencia de comportamiento
A continuación se muestra cómo MULTI_KEYVALUE maneja diversas combinaciones de delimitadores y casos límite. Todas las filas utilizan la consulta mostrada anteriormente sobre la tabla T1.
Datos de prueba (tabla T1)
|
str |
split1 |
split2 |
key1 |
key2 |
|
k1=v1;k2=v2 |
; |
= |
k1 |
k2 |
|
NULL |
; |
= |
k1 |
k2 |
|
k1:v1;k2:v2 |
; |
: |
k1 |
k3 |
|
k1:v1;k2:v2 |
; |
= |
k1 |
k2 |
|
k1:v1;k2:v2 |
, |
: |
k1 |
k2 |
|
k1:v1;k2=v2 |
; |
: |
k1 |
k2 |
|
k1:v1abck2:v2 |
abc |
: |
k1 |
k2 |
|
k1:v1;k2=v2 |
; |
:= |
k1 |
k2 |
|
k1:v1 k2:v2 |
NULL |
: |
k1 |
k2 |
|
k1 v1;k2 v2 |
; |
NULL |
k1 |
k2 |
Instrucción de prueba
SELECT c1, c2
FROM T1, lateral table(MULTI_KEYVALUE(str, split1, split2, key1, key2))
as T(c1, c2);
Resultados
|
c1 |
c2 |
|
v1 |
v2 |
|
NULL |
NULL |
|
v1 |
NULL |
|
NULL |
NULL |
|
NULL |
NULL |
|
v1 |
NULL |
|
v1 |
v2 |
|
v1 |
v2 |
|
v1 |
v2 |
|
v1 |
v2 |
Observaciones clave sobre los resultados:
Fila 2:
stresNULL, por lo que todos los valores de salida sonNULL.Fila 3: la clave
k3no existe en la cadena, así quec2esNULL.Fila 4: el delimitador real es
:, perosplit2es=. Al no haber coincidencia, ambas salidas sonNULL.Fila 5: el delimitador real de pares es
;, perosplit1es,. Al no haber coincidencia, ambas salidas sonNULL.Fila 6:
split2 = ':'coincide conk1:v1, pero no conk2=v2. Por tanto,c1 = 'v1'yc2 = NULL.Fila 7:
split1 = 'abc'tiene más de un carácter, por lo quea,bycse tratan como delimitadores independientes, lo que permite dividir correctamentek1:v1abck2:v2.Fila 8:
split2 = ':='tiene más de un carácter, así que tanto:como=son delimitadores válidos de clave-valor, lo que permite coincidir conk1:v1yk2=v2.Filas 9–10: los delimitadores
NULLtoman el espacio como valor predeterminado.