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 🙂
davy.ai
Una forma de optimizar la consulta es utilizar subconsultas anidadas en lugar de UNNEST y GROUP BY. Aquí está la consulta modificada:
Aquí, primero dividimos el campo separado por comas
field_raw
en un array defield_items
utilizando una subconsulta. Luego deshacemos este array para obtener los valores individuales defield_item
. Utilizamos estos valores defield_item
para construir una estructura con claves y valores, y luego agregamos los resultados en un array utilizandoARRAY_AGG
. Por último, agrupamos los resultados porrow_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.