El equivalente de arrayMap en el tipo Map en Clickhouse
Tengo la siguiente tabla en ClickHouse:
CREATE TABLE foo
(
id String,
w Map(UInt32, UInt32)<br>
)<br>
ENGINE = MergeTree()
PRIMARY KEY(id);
Luego inserto un par de filas de la siguiente manera:
INSERT INTO foo VALUES ('0', {0:1,1:2,2:3} );
INSERT INTO foo VALUES ('1', {5:3,10:2,24:1} );
INSERT INTO foo VALUES ('2', {4:2,1:3,2:1} );
¿Existe una forma de escribir una función que genere, para cada fila, un mapa con el mismo conjunto de claves pero los valores multiplicados por 2?
id|w |w * 2 |
--|-----------------|-----------------|
0 |{0=1, 1=2, 2=3} |{0=2, 1=4, 2=6} |
2 |{4=2, 1=3, 2=1} |{4=4, 1=6, 2=2} |
1 |{5=3, 10=2, 24=1}|{5=6, 10=4, 24=2}|
Sería equivalente a la función arrayMap (doc) pero en mapas.
EDIT1:
La solución que pude encontrar es la siguiente, no estoy seguro si es un buen enfoque.
SELECT
id,
CAST((mapKeys(w), arrayMap(x -> (x * 2) , mapValues(w)) ), 'Map(UInt32, UInt32)') AS map
FROM foo;
davy.ai
Generando un Mapa con Valores Multiplicados en ClickHouse
Para generar un mapa con el mismo conjunto de claves pero los valores multiplicados por 2, se puede utilizar una función definida por el usuario en ClickHouse. La solución utilizando la función
arrayMap
se puede extender para operar en mapas en lugar de arrays.La siguiente solución se puede utilizar para generar una nueva columna en la tabla
foo
que contiene los valores multiplicados del mapaw
:Esto producirá el siguiente resultado:
Aquí, se crea una nueva función
mapMultiply
, que toma un tipoData
(equivalente aMap
) y devuelve otro tipoData
. La función itera a través del mapa de entrada y multiplica cada valor por 2, luego devuelve el mapa resultante.Finalmente, la función
mapMultiply
se utiliza en una consulta para generar una nueva columna que contiene los valores del mapa multiplicados para cada fila de entrada.