Saltar al contenido

¿Cómo elegir la última partición en la tabla de BigQuery?

Solución:

Actualización de octubre de 2019

Apoyo para Scripting y Procedimientos almacenados ahora está en versión beta (a partir de octubre de 2019)

Puede enviar varias declaraciones separadas por punto y coma y BigQuery puede ejecutarlas ahora

Ver ejemplo a continuación

DECLARE max_date TIMESTAMP;
SET max_date = (
  SELECT MAX(_PARTITIONTIME) FROM project.dataset.partitioned_table`);

SELECT * FROM `project.dataset.partitioned_table`
WHERE _PARTITIONTIME = max_date;

Actualización para aquellos a quienes les gusta votar negativamente sin verificar el contexto, etc.

Creo que esta respuesta fue aceptada porque abordó la pregunta principal del OP Is there a way I can pull data only from the latest partition in BigQuery? y en los comentarios se mencionó que es obvio que el motor BQ todavía escanea TODAS las filas pero devuelve el resultado basado en ÚNICAMENTE la partición reciente. Como ya se mencionó en el comentario para la pregunta: Still something that easily to be addressed by having that logic scripted - first getting result of subquery and then use it in final query

Tratar

SELECT * FROM [dataset.partitioned_table]
WHERE _PARTITIONTIME IN (
  SELECT MAX(TIMESTAMP(partition_id))
  FROM [dataset.partitioned_table$__PARTITIONS_SUMMARY__]
)  

o

SELECT * FROM [dataset.partitioned_table]
WHERE _PARTITIONTIME IN (
  SELECT MAX(_PARTITIONTIME) 
  FROM [dataset.partitioned_table]
)  

Perdón por desenterrar esta vieja pregunta, pero surgió en una búsqueda de Google y creo que la respuesta aceptada es engañosa.

Por lo que puedo decir de la documentación y las pruebas en ejecución, la respuesta aceptada será no podar particiones porque se utiliza una subconsulta para determinar la partición más reciente:

Las consultas complejas que requieren la evaluación de varias etapas de una consulta para resolver el predicado (como consultas internas o subconsultas) no eliminarán particiones de la consulta.

Entonces, aunque la respuesta sugerida entregará los resultados esperados, aún consultará todas las particiones. Va a no ignore todas las particiones más antiguas y solo consulte las más recientes.

El truco consiste en utilizar una constante más o menos para comparar, en lugar de una subconsulta. Por ejemplo, si _PARTITIONTIME no es irregular pero a diario, intente podar particiones obteniendo la partición de ayer así:

SELECT * FROM [dataset.partitioned_table]
    WHERE _PARTITIONDATE = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)

Claro, estos no son siempre los datos más recientes, pero en mi caso, resultan ser lo suficientemente cercanos. Usar INTERVAL 0 DAY si desea los datos de hoy y no le importa que la consulta devuelva 0 resultados para la parte del día en la que aún no se ha creado la partición.

¡Me alegra saber si hay una solución mejor para obtener la última partición!

Enumere todas las particiones con:

#standardSQL
SELECT
  _PARTITIONTIME as pt
FROM
  `[DATASET].[TABLE]`
GROUP BY 1

Y luego elija la última marca de tiempo.

Buena suerte 🙂

https://cloud.google.com/bigquery/docs/querying-partitioned-tables

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *