Gestionar tablas con particiones
En este documento se describe cómo gestionar tablas con particiones en BigQuery.
Obtener metadatos de particiones
Puede obtener información sobre las tablas con particiones de las siguientes formas:
- Usa la vista
INFORMATION_SCHEMA.PARTITIONS
(Vista previa). - Usa la metatabla
__PARTITIONS_SUMMARY__
(solo SQL antiguo).
Obtener metadatos de particiones con vistas INFORMATION_SCHEMA
Cuando consultas la vista INFORMATION_SCHEMA.PARTITIONS
, los resultados de la consulta
contienen una fila por cada partición. Por ejemplo, la siguiente consulta muestra todas las particiones de la tabla del conjunto de datos llamado mydataset
:
SELECT table_name, partition_id, total_rows
FROM `mydataset.INFORMATION_SCHEMA.PARTITIONS`
WHERE partition_id IS NOT NULL
Para obtener más información, consulta INFORMATION_SCHEMA.PARTITIONS
.
Obtener metadatos de particiones mediante metatablas
En SQL antiguo, puede obtener metadatos sobre las particiones de una tabla consultando la metatabla __PARTITIONS_SUMMARY__
. Las metatablas son tablas de solo lectura que contienen metadatos.
Consulta la metatabla __PARTITIONS_SUMMARY__
de la siguiente manera:
#legacySQL SELECT column FROM [dataset.table$__PARTITIONS_SUMMARY__]
La metatabla __PARTITIONS_SUMMARY__
tiene las siguientes columnas:
Valor | Descripción |
---|---|
project_id |
Nombre del proyecto. |
dataset_id |
Nombre del conjunto de datos. |
table_id |
Nombre de la tabla con particiones por tiempo. |
partition_id |
Nombre (fecha) de la partición. |
creation_time |
Hora en la que se creó la partición, en milisegundos desde el 1 de enero de 1970 UTC. |
last_modified_time |
La hora en la que se modificó por última vez la partición, en milisegundos desde el 1 de enero de 1970 UTC. |
Para ejecutar un trabajo de consulta que utilice la metatabla __PARTITIONS_SUMMARY__
, debes tener los permisos bigquery.jobs.create
y bigquery.tables.getData
.
Para obtener más información sobre los roles de gestión de identidades y accesos en BigQuery, consulta el artículo sobre el control de acceso.
Definir el vencimiento de la partición
Cuando creas una tabla con particiones por hora de ingestión o por columnas de unidades de tiempo, puedes especificar una caducidad de la partición. Esta opción especifica durante cuánto tiempo BigQuery conserva los datos de cada partición. El ajuste se aplica a todas las particiones de la tabla, pero se calcula de forma independiente para cada partición en función de la hora de la partición.
La hora de vencimiento de una partición se calcula a partir del límite de la partición en UTC. Por ejemplo, con la partición diaria, el límite de la partición es la medianoche (00:00:00 UTC). Si el vencimiento de la partición de la tabla es de 6 horas, cada partición vence a las 06:00:00 UTC del día siguiente. Cuando vence una partición, BigQuery elimina los datos de esa partición.
También puede especificar una caducidad de partición predeterminada a nivel del conjunto de datos. Si define la caducidad de las particiones de una tabla, el valor anula la caducidad predeterminada de las particiones. Si no especifica ninguna caducidad de partición (en la tabla o en el conjunto de datos), las particiones nunca caducarán.
Si define una caducidad de la tabla, ese valor tendrá prioridad sobre la caducidad de la partición. Por ejemplo, si la caducidad de la tabla es de 5 días y la de la partición es de 7, la tabla y todas las particiones que contiene se eliminan al cabo de 5 días.
En cualquier momento después de crear una tabla, puede actualizar la caducidad de la partición de la tabla. El nuevo ajuste se aplica a todas las particiones de esa tabla, independientemente de cuándo se hayan creado. Las particiones que ya tengas caducarán inmediatamente si son anteriores a la nueva hora de vencimiento. Del mismo modo, si se copian o insertan datos en una tabla con particiones por columnas de unidad de tiempo, las particiones más antiguas que la caducidad de particiones configurada para la tabla caducarán inmediatamente.
Cuando una partición caduca, BigQuery la elimina. Los datos de la partición se conservan de acuerdo con las políticas de viaje en el tiempo y a prueba de fallos, y se pueden cobrar en función de tu modelo de facturación. Hasta entonces, el número de particiones se tendrá en cuenta para calcular las cuotas de tablas. Para eliminar una partición inmediatamente, puedes eliminarla manualmente.
Actualizar el vencimiento de la partición
Para actualizar el vencimiento de una partición de una tabla con particiones, sigue estos pasos:
Consola
No puedes actualizar el vencimiento de la partición en la Google Cloud consola.
SQL
Usa la instrucción ALTER TABLE SET OPTIONS
.
En el siguiente ejemplo se actualiza el vencimiento a 5 días. Para quitar la fecha de vencimiento de la partición de una tabla, asigna el valor NULL
a partition_expiration_days
.
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, introduce la siguiente instrucción:
ALTER TABLE mydataset.mytable SET OPTIONS ( -- Sets partition expiration to 5 days partition_expiration_days = 5);
Haz clic en
Ejecutar.
Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.
bq
Ejecuta el comando bq update
con la marca --time_partitioning_expiration
. Si vas a actualizar una tabla particionada en un proyecto que no sea el predeterminado, añade el ID del proyecto al nombre del conjunto de datos con el siguiente formato: project_id:dataset
.
bq update \ --time_partitioning_expiration integer_in_seconds \ --time_partitioning_type unit_time \ project_id:dataset.table
Donde:
- integer es el tiempo de vida predeterminado (en segundos) de las particiones de la tabla. No hay ningún valor mínimo. El tiempo de vencimiento se evalúa como la fecha de la partición más el valor entero. Si especificas
0
, se elimina la caducidad de la partición y esta nunca caduca. Las particiones sin fecha de vencimiento deben eliminarse manualmente. - unit_time puede ser
DAY
,HOUR
,MONTH
oYEAR
, en función de la granularidad de la partición de la tabla. Este valor debe coincidir con la granularidad que haya definido al crear la tabla. - project_id es el ID del proyecto.
- dataset es el nombre del conjunto de datos que contiene la tabla que quieres actualizar.
- table es el nombre de la tabla que vas a actualizar.
Ejemplos:
Introduce el siguiente comando para actualizar el tiempo de vencimiento de las particiones de mydataset.mytable
a 5 días (432.000 segundos). mydataset
está en tu proyecto predeterminado.
bq update --time_partitioning_expiration 432000 mydataset.mytable
Introduce el siguiente comando para actualizar el tiempo de vencimiento de las particiones de mydataset.mytable
a 5 días (432.000 segundos). mydataset
está en
myotherproject
, no en tu proyecto predeterminado.
bq update \
--time_partitioning_expiration 432000 \
myotherproject:mydataset.mytable
API
Llama al método tables.patch
y usa la propiedad timePartitioning.expirationMs
para actualizar la
caducidad de la partición en milisegundos. Como el método tables.update
sustituye todo el recurso de la tabla, se recomienda usar el método tables.patch
.
Definir los requisitos del filtro de partición
Cuando creas una tabla particionada, puedes requerir que todas las consultas de la tabla incluyan un filtro de predicado (una cláusula WHERE
) que filtre por la columna de partición. Este ajuste puede mejorar el rendimiento y reducir los costes, ya que BigQuery puede usar el filtro para eliminar las particiones que no coincidan con el predicado. Este requisito también se aplica a las consultas en vistas y vistas materializadas que hacen referencia a la tabla con particiones.
Para obtener información sobre cómo añadir la opción Requerir filtro de partición al crear una tabla con particiones, consulta el artículo Crear tablas con particiones.
Si una tabla particionada tiene el ajuste Requerir filtro de partición, todas las consultas de esa tabla deben incluir al menos un predicado que solo haga referencia a la columna de partición. Las consultas sin este predicado devuelven el siguiente error:
Cannot query over table 'project_id.dataset.table' without a
filter that can be used for partition elimination
.
Para obtener más información, consulta Consultar tablas particionadas.
Actualizar el requisito de filtro de partición
Si no habilitas la opción Requerir filtro de partición al crear la tabla particionada, puedes actualizar la tabla para añadir la opción.
Consola
No puedes usar la consola de Google Cloud para requerir filtros de partición después de crear una tabla particionada.
SQL
Usa laALTER TABLE SET OPTIONS
declaración
para actualizar el requisito del filtro de partición. En el siguiente ejemplo se actualiza el requisito a true
:
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, introduce la siguiente instrucción:
ALTER TABLE mydataset.mypartitionedtable SET OPTIONS ( require_partition_filter = true);
Haz clic en
Ejecutar.
Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.
bq
Para actualizar una tabla particionada para que requiera filtros de partición mediante la herramienta de línea de comandos bq, introduce el comando bq update
y proporciona la marca --require_partition_filter
.
Para actualizar una tabla particionada en un proyecto que no sea el predeterminado, añade el ID del proyecto al conjunto de datos con el siguiente formato: project_id:dataset.
Por ejemplo:
Para actualizar mypartitionedtable
en mydataset
en tu proyecto predeterminado,
introduce lo siguiente:
bq update --require_partition_filter mydataset.mytable
Para actualizar mypartitionedtable
en mydataset
en myotherproject
,
introduce lo siguiente:
bq update --require_partition_filter myotherproject:mydataset.mytable
API
Llama al método tables.patch
y asigna el valor true
a la propiedad requirePartitionFilter
para requerir filtros de partición. Como el método tables.update
sustituye todo el recurso de tabla, es preferible usar el método tables.patch
.
Java
Antes de probar este ejemplo, sigue las Javainstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de BigQuery.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.
Copiar una tabla con particiones
El proceso para copiar una tabla con particiones es el mismo que el que se sigue para copiar una tabla estándar. Para obtener más información, consulta el artículo sobre cómo copiar una tabla.
Cuando copies una tabla particionada, ten en cuenta lo siguiente:
- Copiar una tabla con particiones en una tabla de destino nueva
- Toda la información de las particiones se copia con la tabla. La tabla nueva y la antigua tendrán las mismas particiones.
- Copiar una tabla sin particiones en una tabla con particiones
- Esta operación solo se admite en particiones creadas en el momento de la ingestión. BigQuery copia los datos de origen en la partición que representa la fecha actual. Esta operación no se admite en tablas con particiones de columnas de unidades de tiempo o de intervalos de números enteros.
- Copiar una tabla con particiones en otra tabla con particiones
- Las especificaciones de partición de las tablas de origen y de destino deben coincidir.
- Copiar una tabla con particiones en una tabla sin particiones
- La tabla de destino no se particiona.
- Copiar varias tablas con particiones
Si copias varias tablas de origen en una tabla con particiones en el mismo trabajo, las tablas de origen no pueden contener una mezcla de tablas con y sin particiones.
Si todas las tablas de origen son tablas particionadas, las especificaciones de partición de todas las tablas de origen deben coincidir con la especificación de partición de la tabla de destino.
- Copiar una tabla con particiones que tenga una especificación de clústeres
Si copias los datos en una tabla nueva, toda la información de clustering se copia con la tabla. La tabla nueva y la antigua tendrán el mismo clustering.
Si copia datos en una tabla ya creada, las especificaciones de clúster de las tablas de origen y de destino deben coincidir.
Cuando copias datos en una tabla, puedes especificar si quieres añadir datos a la tabla de destino o sobrescribirla.
Copiar particiones individuales
Puedes copiar los datos de una o varias particiones en otra tabla.
Consola
La consola de Google Cloud no permite copiar particiones.
bq
Para copiar una partición, usa el comando bq cp
(copiar) de la herramienta de línea de comandos bq con un decorador de partición ($date
), como $20160201
.
Se pueden usar marcas opcionales para controlar la disposición de escritura de la partición de destino:
-a
o--append_table
añade los datos de la partición de origen a una tabla o partición del conjunto de datos de destino.-f
o--force
sobrescribe una tabla o una partición que ya exista en el conjunto de datos de destino y no te pide confirmación.-n
o--no_clobber
devuelve el siguiente mensaje de error si la tabla o la partición existen en el conjunto de datos de destino:Table '<var>project_id:dataset.table</var> or <var>table$date</var>' already exists, skipping.
Si no se especifica-n
, el comportamiento predeterminado es pedirte que elijas si quieres sustituir la tabla o la partición de destino.--destination_kms_key
es la clave de Cloud KMS gestionada por el cliente que se usa para encriptar la tabla o la partición de destino.
El comando cp
no admite las marcas --time_partitioning_field
ni --time_partitioning_type
. No puedes usar un trabajo de copia para convertir una tabla con particiones por hora de ingestión en una tabla con particiones.
--destination_kms_key
no se muestra aquí. Consulta Proteger datos con claves de Cloud KMS para obtener más información.
Si el conjunto de datos de origen o de destino se encuentra en un proyecto que no es el predeterminado, añade el ID del proyecto a los nombres de los conjuntos de datos con el siguiente formato:
project_id:dataset
.
(Opcional) Proporcione la marca --location
y asigne el valor a su ubicación.
bq --location=location cp \ -a -f -n \ project_id:dataset.source_table$source_partition \ project_id:dataset.destination_table$destination_partition
Donde:
- location es el nombre de tu ubicación. La marca
--location
es opcional. Por ejemplo, si usas BigQuery en la región de Tokio, puedes asignar el valorasia-northeast1
a la marca. Puedes definir un valor predeterminado para la ubicación mediante el archivo.bigqueryrc. - project_id es el ID del proyecto.
- dataset es el nombre del conjunto de datos de origen o de destino.
- source_table es la tabla que vas a copiar.
- source_partition es el decorador de partición de la partición de origen.
- destination_table es el nombre de la tabla del conjunto de datos de destino.
- destination_partition es el decorador de partición de la partición de destino.
Ejemplos:
Copiar una partición en una tabla nueva
Introduce el siguiente comando para copiar la partición del 30 de enero del 2018 de
mydataset.mytable
en una tabla nueva: mydataset.mytable2
. mydataset
está en tu proyecto predeterminado.
bq cp -a 'mydataset.mytable$20180130' mydataset.mytable2
Copiar una partición en una tabla sin particiones
Introduce el siguiente comando para copiar la partición del 30 de enero del 2018 de
mydataset.mytable
en una tabla sin particiones:
mydataset2.mytable2
. La combinación de teclas -a
se usa para añadir los datos de la partición a la tabla de destino sin particiones. Ambos conjuntos de datos están en tu proyecto predeterminado.
bq cp -a 'mydataset.mytable$20180130' mydataset2.mytable2
Introduce el siguiente comando para copiar la partición del 30 de enero del 2018 de
mydataset.mytable
en una tabla sin particiones:
mydataset2.mytable2
. La combinación de teclas -f
se usa para sobrescribir la tabla de destino sin particiones sin pedir confirmación.
bq --location=US cp -f 'mydataset.mytable$20180130' mydataset2.mytable2
Copiar una partición en otra tabla con particiones
Introduce el siguiente comando para copiar la partición del 30 de enero del 2018 de
mydataset.mytable
a otra tabla particionada:
mydataset2.mytable2
. La combinación de teclas -a
se usa para añadir los datos de la partición a la tabla de destino. Como no se ha especificado ningún decorador de partición en la tabla de destino, se conserva la clave de partición de origen y los datos se copian en la partición del 30 de enero del 2018 de la tabla de destino. También puedes especificar un decorador de partición en la tabla de destino para copiar datos en una partición específica. mydataset
está en tu proyecto predeterminado. mydataset2
está en myotherproject
, no en tu proyecto predeterminado.
bq --location=US cp \
-a \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2
Introduce el siguiente comando para copiar la partición del 30 de enero del 2018 de mydataset.mytable
en la partición del 30 de enero del 2018 de otra tabla particionada, mydataset2.mytable2
. Se usa la combinación de teclas -f
para sobrescribir la partición del 30 de enero del 2018 en la tabla de destino sin que se te pida confirmación. Si no se usa ningún decorador de partición, se sobrescribirán todos los datos de la tabla de destino. mydataset
está en tu proyecto predeterminado.
mydataset2
está en myotherproject
, no en tu proyecto predeterminado.
bq cp \
-f \
'mydataset.mytable$20180130' \
'myotherproject:mydataset2.mytable2$20180130'
Introduce el siguiente comando para copiar la partición del 30 de enero del 2018 de
mydataset.mytable
a otra tabla particionada:
mydataset2.mytable2
. mydataset
está en tu proyecto predeterminado. mydataset2
está en myotherproject
, no en tu proyecto predeterminado. Si hay datos en la tabla de destino, el comportamiento predeterminado es pedirte que los sobrescribas.
bq cp \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2
Para copiar varias particiones, especifícalas en una lista separada por comas:
bq cp \ 'mydataset.mytable$20180130,mydataset.mytable$20180131' \ myotherproject:mydataset.mytable2
API
Llama al método jobs.insert
y configura una tarea copy
. (Opcional) Especifica tu región en la propiedad location
de la sección jobReference
del recurso de trabajo.
Especifique las siguientes propiedades en la configuración del trabajo:
- Introduce el conjunto de datos, la tabla y la partición de origen en la propiedad
sourceTables
. - Introduce el conjunto de datos y la tabla de destino en la propiedad
destinationTable
. - Use la propiedad
writeDisposition
para especificar si quiere añadir o sobrescribir la tabla o la partición de destino.
Para copiar varias particiones, introduce las particiones de origen (incluidos los nombres del conjunto de datos y de la tabla) en la propiedad sourceTables
.
Eliminar una partición
Puede eliminar una partición de una tabla particionada. Sin embargo, no puedes eliminar las particiones especiales __NULL__
o __UNPARTITIONED__
.
Solo puedes eliminar una partición a la vez.
Puedes eliminar una partición especificando el decorador de la partición, a menos que sea una de las dos particiones especiales.
Para eliminar una partición de una tabla con particiones, sigue estos pasos:
Consola
La consola de Google Cloud no admite la eliminación de particiones.
SQL
Si una instrucción DELETE
que cumple los requisitos
cubre todas las filas de una partición,
BigQuery elimina toda la partición. Esta eliminación se realiza sin analizar bytes ni consumir ranuras. En el siguiente ejemplo de una instrucción DELETE
se cubre toda la partición de un filtro en la pseudocolumna _PARTITIONDATE
:
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, introduce la siguiente instrucción:
DELETE mydataset.mytable WHERE _PARTITIONDATE IN ('2076-10-07', '2076-03-06');
Haz clic en
Ejecutar.
Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.
bq
Usa el comando bq rm
con la marca --table
(o el acceso directo -t
) y especifica el decorador de partición para eliminar una partición concreta.
bq rm --table project_id:dataset.table$partition
Donde:
- project_id es el ID del proyecto. Si se omite, se usará el proyecto predeterminado.
- dataset es el nombre del conjunto de datos que contiene la tabla.
- table es el nombre de la tabla.
- partition es el decorador de partición de la partición que vas a eliminar.
Los decoradores de partición tienen el siguiente formato, según el tipo de partición:
- Partición por horas:
yyyymmddhh
. Ejemplo:$2016030100
- Partición diaria:
yyyymmdd
. Ejemplo:$20160301
- Partición mensual:
yyyymm
. Ejemplo:$201603
- Partición anual:
yyyy
. Ejemplo:$2016
- Partición de intervalo de números enteros: inicio del intervalo de partición. Ejemplo:
$20
La herramienta de línea de comandos bq te pedirá que confirmes la acción. Para saltarte la confirmación, usa la marca --force
(o el acceso directo -f
).
Ejemplos:
Elimina la partición del 1 de marzo del 2016 de una tabla con particiones diarias llamada mydataset.mytable
en tu proyecto predeterminado:
bq rm --table 'mydataset.mytable$20160301'
Elimina la partición de marzo del 2016 de una tabla con particiones mensuales:
bq rm --table 'mydataset.mytable$201603'
Elimina el intervalo de números enteros que empieza en 20 de una tabla con particiones de intervalo de números enteros llamada mydataset.mytable
:
bq rm --table 'mydataset.mytable$20'
API
Llama al método tables.delete
y especifica el decorador de tabla y partición mediante el parámetro tableId
.
Seguridad de las tablas con particiones
El control de acceso de las tablas con particiones es el mismo que el de las tablas estándar. Para obtener más información, consulta Introducción a los controles de acceso a tablas.