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.

¿Puedo consultar un campo JSON de Crashlytics como una directiva “where” en BigQuery?

He buscado en SO para esto y he encontrado varias preguntas similares, pero no puedo entender cómo aplicarlas a mi escenario.

Tenemos Google Crashlytics vinculado a BigQuery.

Dada la siguiente tabla de datos (se eliminaron varias columnas para mayor claridad):

TABLE firebase<em>crashlytics.com</em>foo_ios

<h1>is_fatal | aplicación</h1>

<p>true     | {"v":{"f":[{"v":"53"},{"v":"0.9.1"}]}}
false    | {"v":{"f":[{"v":"71"},{"v":"1.0.0"}]}}
true     | {"v":{"f":[{"v":"72"},{"v":"1.0.1"}]}}

He intentado muchas de las sugerencias, pero no logro que funcione.

Quiero hacer una consulta a la tabla comfooios para todos los registros en los que el valor de is_fatal sea igual a true, y la versión de la aplicación (el segundo elemento del array application) sea mayor que 1.0.0. Alternativamente, podría usar el número de compilación ya que eso es único para las versiones.

Entonces mi pregunta es:

¿Se puede hacer esto a través de una consulta SQL sin tener que escribir funciones personalizadas como se sugiere en la respuesta de Berlyant aquí, que no funcionó para mí?

Curiosamente, los errores que veo indican que los dos elementos del array application se identifican como build_version y display_name. También he intentado usar esos en las consultas, pero sin éxito.

Utilizando los datos de muestra anteriores, ¿alguien puede sugerir una forma sencilla de consultar esta información?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible obtener el resultado deseado con una consulta SQL. Suponiendo que la columna application sea de tipo STRUCT, la consulta se vería algo así:

    SELECT *
    FROM firebase_crashlytics.com_foo_ios
    WHERE is_fatal = true
    AND (CAST(SPLIT(application.v.f[OFFSET(1)].v, '.')[-1] AS INT64) > 0
         OR CAST(SPLIT(application.v.f[OFFSET(0)].v, '.')[-1] AS INT64) > 0);
    

    Esta consulta filtra los registros donde is_fatal es true y donde el último elemento del array de versiones (que asumimos es la versión de parche) sea mayor que 0, o el segundo elemento desde el final del array (que asumimos es la versión menor) sea mayor que 0. Convertimos estos elementos a enteros utilizando la función CAST y utilizamos la función SPLIT para obtener el elemento adecuado del array según su posición.

    Ten en cuenta que esto supone que los números de versión siempre siguen el formato mayor.menor.parche y que la columna application siempre es una estructura válida. Si esto no es así, es posible que debas ajustar la consulta.

Comments are closed.