es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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;
Tags:  

Answer

  1. Avatar for 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 mapa w:

    CREATE FUNCTION mapMultiply(map Data) 
    RETURNS (Data)
    IMMUTABLE
    LANGUAGE JAVASCRIPT
    {
        var res = {};
    
        for (var key in map) {
            res[key] = map[key] * 2;
        }
    
        return res;
    }
    
    SELECT id, w, mapMultiply(w) AS w_times_2
    FROM foo;
    

    Esto producirá el siguiente resultado:

    ┌─id─┬─w──────────────────────┬─w_times_2──────────────┐
    │ 0  │ {0:1,1:2,2:3}           │ {0:2,1:4,2:6}           │
    │ 1  │ {5:3,10:2,24:1}         │ {5:6,10:4,24:2}         │
    │ 2  │ {4:2,1:3,2:1}           │ {4:4,1:6,2:2}           │
    └────┴────────────────────────┴────────────────────────┘
    

    Aquí, se crea una nueva función mapMultiply, que toma un tipo Data (equivalente a Map) y devuelve otro tipo Data. 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.

Comments are closed.