A função de tabela MULTI_KEYVALUE extrai múltiplos valores de uma string formatada como chave-valor em uma única chamada. Ela divide a string em pares de chave-valor usando o delimitador especificado por split1. Em seguida, separa cada par em chave e valor com o delimitador definido em split2 e retorna os valores correspondentes às chaves solicitadas.
Há suporte para essa função no Realtime Compute for Apache Flink com Ververica Runtime (VVR) 3.0.0 ou posterior.
Sintaxe
MULTI_KEYVALUE(VARCHAR str, VARCHAR split1, VARCHAR split2, VARCHAR key_name1, VARCHAR key_name2, ...)
Como MULTI_KEYVALUE é uma função de tabela, invoque-a com um join 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 |
Descrição |
|
|
|
String a ser analisada. |
|
|
|
Delimitador dos pares de chave-valor. Se for |
|
|
|
Delimitador entre chave e valor. Caso seja |
|
|
|
Chaves cujos valores devem ser retornados. Adicione quantos argumentos de chave forem necessários. |
Quando usar KEYVALUE em vez disso
No VVR 8.0.7 e versões anteriores, utilize a função escalar KEYVALUE no lugar de MULTI_KEYVALUE nas seguintes situações:
Todos os valores de
split1,split2e de cada argumentokey_namesão strings constantes.Dentro de um namespace que executa uma versão específica do mecanismo,
MULTI_KEYVALUEé chamado várias vezes com diferentes delimitadoressplit1esplit2, seja na mesma implantação ou em várias implantações. Ao analisar nomes de chave distintos do mesmo campo em chamadas repetidas, a funçãoKEYVALUEpermite que o Flink reutilize resultados intermediários de análise e aplique um mecanismo de análise binária, o que melhora a eficiência geral do processamento. Por ser uma função escalar, invoqueKEYVALUEuma vez para cada chave.
Exemplo
Uso básico
Analise k1=v1;k2=v2 usando ; como delimitador de pares e = como delimitador de chave-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'
Referência de comportamento
A tabela a seguir ilustra como MULTI_KEYVALUE lida com diversas combinações de delimitadores e casos extremos. Todas as linhas utilizam a consulta mostrada acima na tabela T1.
Dados de teste (tabela 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 |
Instrução de teste
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 |
Principais observações sobre os resultados:
Linha 2: como
stréNULL, todos os valores de saída resultam emNULL.Linha 3: a chave
k3não existe na string, portantoc2retornaNULL.Linha 4: o delimitador real é
:, massplit2está definido como=. Sem correspondência, ambas as saídas sãoNULL.Linha 5: o delimitador de pares real é
;, porémsplit1é,. Não há correspondência, logo as duas saídas sãoNULL.Linha 6:
split2 = ':'corresponde ak1:v1, mas não ak2=v2. Assim,c1 = 'v1'ec2 = NULL.Linha 7: como
split1 = 'abc'possui mais de um caractere,a,becfuncionam como delimitadores independentes, dividindo corretamentek1:v1abck2:v2.Linha 8: dado que
split2 = ':='tem mais de um caractere, tanto:quanto=atuam como delimitadores válidos de chave-valor, encontrando correspondência emk1:v1ek2=v2.Linhas 9–10: delimitadores
NULLassumem espaço como padrão.