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.

Optimización de consultas de BigQuery: Desanidar campo a STRUCT REPEATED

Actualmente tengo la siguiente consulta que funciona perfectamente, pero me gustaría saber si se puede optimizar (quizás evitando el UNNEST primero y el GROUP BY después y hacer las transformaciones en un solo paso).

with src as (
    select 1 as row_key, "key_A:value_A,key_B:value_B,key_C:value_C" as field_raw
), tmp as (
    select
        row_key
        , STRUCT(
            split(field_items, ':')[offset(0)] as key
            , split(field_items, ':')[offset(1)] as value
        ) AS field_items
    from src
    , unnest(split(field_raw, ',')) field_items
)
select
    row_key
    , ARRAY_AGG(field_items) as field_items
from tmp
group by row_key

Entrada:

row_key field_raw
1 key_A:value_A,key_B:value_B,key_C:value_C

Salida esperada:

row_key field_items.key field_items.value
1 key_A value_A
key_B value_B
key_C value_C

Gracias por la ayuda 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de optimizar la consulta es utilizar subconsultas anidadas en lugar de UNNEST y GROUP BY. Aquí está la consulta modificada:

    CON src AS (
        SELECT 1 AS row_key, "key_A:value_A,key_B:value_B,key_C:value_C" AS field_raw
    ), tmp AS (
        SELECT
            row_key,
            ARRAY_AGG(
                STRUCT(
                    SPLIT(field_item, ":")[OFFSET(0)] AS key,
                    SPLIT(field_item, ":")[OFFSET(1)] AS value
                )
            ) AS field_items
        FROM (
            SELECT row_key, SPLIT(field_raw, ",") AS field_items
            FROM src
        )
        , UNNEST(field_items) AS field_item
        GROUP BY row_key
    )
    SELECT *
    FROM tmp
    

    Aquí, primero dividimos el campo separado por comas field_raw en un array de field_items utilizando una subconsulta. Luego deshacemos este array para obtener los valores individuales de field_item. Utilizamos estos valores de field_item para construir una estructura con claves y valores, y luego agregamos los resultados en un array utilizando ARRAY_AGG. Por último, agrupamos los resultados por row_key y mostramos el resultado de la consulta.

    Con esta consulta modificada, evitamos la necesidad de realizar UNNEST y GROUP BY por separado, y en su lugar realizamos ambos pasos de una vez. Esto debería mejorar el rendimiento de la consulta, especialmente cuando se trabaja con conjuntos de datos grandes.

Comments are closed.