Crear tablas con particiones

En esta página se describe cómo crear tablas con particiones en BigQuery. Para obtener una descripción general de las tablas particionadas, consulta el artículo Introducción a las tablas particionadas.

Antes de empezar

Concede roles de gestión de identidades y accesos (IAM) que proporcionen a los usuarios los permisos necesarios para realizar cada tarea de este documento.

Permisos obligatorios

Roles obligatorios

Para obtener los permisos que necesitas para crear una tabla, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para crear una tabla. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para crear una tabla, se necesitan los siguientes permisos:

  • bigquery.tables.create en el conjunto de datos en el que vas a crear la tabla.
  • bigquery.tables.getData en todas las tablas y vistas a las que hace referencia tu consulta si guardas los resultados de la consulta en una tabla.
  • bigquery.jobs.create en el proyecto si creas la tabla cargando datos o guardando los resultados de una consulta en una tabla.
  • bigquery.tables.updateData en la tabla si vas a añadir o sobrescribir una tabla con los resultados de la consulta.

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Crear una tabla con particiones vacía

Los pasos para crear una tabla con particiones en BigQuery son similares a los de las tablas estándares; la única diferencia es que se especifican las opciones de partición y las demás opciones de las tablas.

Crear una tabla con particiones por columnas de unidades de tiempo

Para crear una tabla vacía con particiones por columnas de unidades de tiempo con una definición de esquema:

Consola

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos.
  3. En la sección Información del conjunto de datos, haz clic en Crear tabla.
  4. En el panel Crear tabla, especifica los siguientes detalles:
    1. En la sección Fuente, selecciona Tabla vacía en la lista Crear tabla a partir de.
    2. En la sección Destino, especifica los siguientes detalles:
      1. En Conjunto de datos, selecciona el conjunto de datos en el que quieras crear la tabla.
      2. En el campo Tabla, introduce el nombre de la tabla que quieras crear.
      3. Verifica que el campo Tipo de tabla sea Tabla nativa.
    3. En la sección Schema (Esquema), introduce la definición de schema. El esquema debe incluir una columna DATE, TIMESTAMP o DATETIME para la columna de partición. Para obtener más información, consulta Especificar un esquema. Puede introducir la información del esquema manualmente mediante uno de los siguientes métodos:
      • Opción 1: Haz clic en Editar como texto y pega el esquema en forma de matriz JSON. Cuando usas una matriz JSON, generas el esquema siguiendo el mismo proceso que para crear un archivo de esquema JSON. Para ver el esquema de una tabla en formato JSON, introduce el siguiente comando:
            bq show --format=prettyjson dataset.table
            
      • Opción 2: Haz clic en Añadir campo e introduce el esquema de la tabla. Especifica el Nombre, Tipo y Modo de cada campo.
    4. En la sección Configuración de particiones y clústeres, en la lista Partición, selecciona Partición por campo y, a continuación, elige la columna de partición. Esta opción solo está disponible si el esquema contiene una columna DATE, TIMESTAMP o DATETIME.
    5. Opcional: Para requerir un filtro de partición en todas las consultas de esta tabla, seleccione la casilla Requerir filtro de partición. Un filtro de partición puede reducir los costes y mejorar el rendimiento. Para obtener más información, consulta Definir los requisitos del filtro de partición.
    6. Selecciona el Tipo de partición. Solo se admite Por día.
    7. Opcional: En la sección Opciones avanzadas, si quieres usar una clave de cifrado gestionada por el cliente, selecciona la opción Usar una clave de cifrado gestionada por el cliente (CMEK). De forma predeterminada, BigQuery encripta el contenido de los clientes almacenado en reposo mediante una Google-owned and Google-managed encryption key.
    8. Haz clic en Crear tabla.

SQL

Para crear una tabla con particiones por columnas de unidades de tiempo, usa la declaración de DDL CREATE TABLE con una cláusula PARTITION BY.

En el ejemplo siguiente se crea una tabla con particiones diarias basadas en la columna transaction_date:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

    CREATE TABLE
      mydataset.newtable (transaction_id INT64, transaction_date DATE)
    PARTITION BY
      transaction_date
      OPTIONS (
        partition_expiration_days = 3,
        require_partition_filter = TRUE);

    Usa la cláusula OPTIONS para definir opciones de tabla, como la caducidad de la partición y los requisitos del filtro de partición.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

El tipo de partición predeterminado de las columnas DATE es la partición diaria. Para especificar otro tipo de partición, incluye la función DATE_TRUNC en la cláusula PARTITION BY. Por ejemplo, la siguiente consulta crea una tabla con particiones mensuales:

CREATE TABLE
  mydataset.newtable (transaction_id INT64, transaction_date DATE)
PARTITION BY
  DATE_TRUNC(transaction_date, MONTH)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

También puede especificar una columna TIMESTAMP o DATETIME como columna de partición. En ese caso, incluya la función TIMESTAMP_TRUNC o DATETIME_TRUNC en la cláusula PARTITION BY para especificar el tipo de partición. Por ejemplo, la siguiente instrucción crea una tabla con particiones diarias basadas en una columna TIMESTAMP:

CREATE TABLE
  mydataset.newtable (transaction_id INT64, transaction_ts TIMESTAMP)
PARTITION BY
  TIMESTAMP_TRUNC(transaction_ts, DAY)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Usa el comando bq mk con la marca --table (o el acceso directo de -t):

    bq mk \
       --table \
       --schema SCHEMA \
       --time_partitioning_field COLUMN \
       --time_partitioning_type UNIT_TIME \
       --time_partitioning_expiration EXPIRATION_TIME \
       --require_partition_filter=BOOLEAN
       PROJECT_ID:DATASET.TABLE

    Haz los cambios siguientes:

    • SCHEMA: una definición de esquema en formato column:data_type,column:data_type o la ruta a un archivo de esquema JSON en tu máquina local. Para obtener más información, consulta Especificar un esquema.
    • COLUMN: el nombre de la columna de partición. En el esquema de la tabla, esta columna debe ser de tipo TIMESTAMP, DATETIME o DATE.
    • UNIT_TIME: el tipo de partición. Los valores admitidos son DAY, HOUR, MONTH y YEAR.
    • EXPIRATION_TIME: el tiempo de vencimiento de las particiones de la tabla, en segundos. La marca --time_partitioning_expiration es opcional. Para obtener más información, consulta Establecer la caducidad de la partición.
    • BOOLEAN: Si true, las consultas en esta tabla deben incluir un filtro de partición. La marca --require_partition_filter es opcional. Para obtener más información, consulta Definir los requisitos de los filtros de partición.
    • PROJECT_ID: el ID del proyecto. Si se omite, se usará el proyecto predeterminado.
    • DATASET: el nombre de un conjunto de datos de tu proyecto.
    • TABLE: el nombre de la tabla que se va a crear.

    Para ver otras opciones de línea de comandos, consulta bq mk.

    En el siguiente ejemplo se crea una tabla llamada mytable que se divide en particiones por horas en la columna ts. La caducidad de la partición es de 259.200 segundos (3 días).

    bq mk \
       -t \
       --schema 'ts:TIMESTAMP,qtr:STRING,sales:FLOAT' \
       --time_partitioning_field ts \
       --time_partitioning_type HOUR \
       --time_partitioning_expiration 259200  \
       mydataset.mytable
  3. Terraform

    Usa el recurso google_bigquery_table.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar la autenticación para bibliotecas de cliente.

    En el siguiente ejemplo se crea una tabla denominada mytable que se particiona por día:

    resource "google_bigquery_dataset" "default" {
      dataset_id                      = "mydataset"
      default_partition_expiration_ms = 2592000000  # 30 days
      default_table_expiration_ms     = 31536000000 # 365 days
      description                     = "dataset description"
      location                        = "US"
      max_time_travel_hours           = 96 # 4 days
    
      labels = {
        billing_group = "accounting",
        pii           = "sensitive"
      }
    }
    
    resource "google_bigquery_table" "default" {
      dataset_id          = google_bigquery_dataset.default.dataset_id
      table_id            = "mytable"
      deletion_protection = false # set to "true" in production
    
      time_partitioning {
        type          = "DAY"
        field         = "Created"
        expiration_ms = 432000000 # 5 days
      }
      require_partition_filter = true
    
      schema = <<EOF
    [
      {
        "name": "ID",
        "type": "INT64",
        "mode": "NULLABLE",
        "description": "Item ID"
      },
      {
        "name": "Created",
        "type": "TIMESTAMP",
        "description": "Record creation timestamp"
      },
      {
        "name": "Item",
        "type": "STRING",
        "mode": "NULLABLE"
      }
    ]
    EOF
    
    }

    Para aplicar la configuración de Terraform en un proyecto, sigue los pasos que se indican en las siguientes secciones. Google Cloud

    Preparar Cloud Shell

    1. Abre Cloud Shell.
    2. Define el Google Cloud proyecto Google Cloud predeterminado en el que quieras aplicar tus configuraciones de Terraform.

      Solo tiene que ejecutar este comando una vez por proyecto y puede hacerlo en cualquier directorio.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.

    Preparar el directorio

    Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

    1. En Cloud Shell, crea un directorio y un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión .tf. Por ejemplo, main.tf. En este tutorial, nos referiremos al archivo como main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.

      Copia el código de ejemplo en el archivo main.tf que acabas de crear.

      También puedes copiar el código de GitHub. Se recomienda cuando el fragmento de Terraform forma parte de una solución integral.

    3. Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
    4. Guarda los cambios.
    5. Inicializa Terraform. Solo tienes que hacerlo una vez por directorio.
      terraform init

      Si quieres usar la versión más reciente del proveedor de Google, incluye la opción -upgrade:

      terraform init -upgrade

    Aplica los cambios

    1. Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
      terraform plan

      Haga las correcciones necesarias en la configuración.

    2. Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo yes en la petición:
      terraform apply

      Espera hasta que Terraform muestre el mensaje "Apply complete!".

    3. Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para asegurarte de que Terraform los ha creado o actualizado.

    API

    Llama al método tables.insert con un recurso de tabla definido que especifica la propiedad timePartitioning y la propiedad schema.

    Go

    Antes de probar este ejemplo, sigue las Goinstrucciones 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 Go 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.

    import (
    	"context"
    	"fmt"
    	"time"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // createTablePartitioned demonstrates creating a table and specifying a time partitioning configuration.
    func createTablePartitioned(projectID, datasetID, tableID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydatasetid"
    	// tableID := "mytableid"
    	ctx := context.Background()
    
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	sampleSchema := bigquery.Schema{
    		{Name: "name", Type: bigquery.StringFieldType},
    		{Name: "post_abbr", Type: bigquery.IntegerFieldType},
    		{Name: "date", Type: bigquery.DateFieldType},
    	}
    	metadata := &bigquery.TableMetadata{
    		TimePartitioning: &bigquery.TimePartitioning{
    			Field:      "date",
    			Expiration: 90 * 24 * time.Hour,
    		},
    		Schema: sampleSchema,
    	}
    	tableRef := client.Dataset(datasetID).Table(tableID)
    	if err := tableRef.Create(ctx, metadata); err != nil {
    		return err
    	}
    	return nil
    }
    

    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.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Field;
    import com.google.cloud.bigquery.Schema;
    import com.google.cloud.bigquery.StandardSQLTypeName;
    import com.google.cloud.bigquery.StandardTableDefinition;
    import com.google.cloud.bigquery.TableId;
    import com.google.cloud.bigquery.TableInfo;
    import com.google.cloud.bigquery.TimePartitioning;
    
    // Sample to create a partition table
    public class CreatePartitionedTable {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        String datasetName = "MY_DATASET_NAME";
        String tableName = "MY_TABLE_NAME";
        Schema schema =
            Schema.of(
                Field.of("name", StandardSQLTypeName.STRING),
                Field.of("post_abbr", StandardSQLTypeName.STRING),
                Field.of("date", StandardSQLTypeName.DATE));
        createPartitionedTable(datasetName, tableName, schema);
      }
    
      public static void createPartitionedTable(String datasetName, String tableName, Schema schema) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          TableId tableId = TableId.of(datasetName, tableName);
    
          TimePartitioning partitioning =
              TimePartitioning.newBuilder(TimePartitioning.Type.DAY)
                  .setField("date") //  name of column to use for partitioning
                  .setExpirationMs(7776000000L) // 90 days
                  .build();
    
          StandardTableDefinition tableDefinition =
              StandardTableDefinition.newBuilder()
                  .setSchema(schema)
                  .setTimePartitioning(partitioning)
                  .build();
          TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();
    
          bigquery.create(tableInfo);
          System.out.println("Partitioned table created successfully");
        } catch (BigQueryException e) {
          System.out.println("Partitioned table was not created. \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de probar este ejemplo, sigue las Node.jsinstrucciones 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 Node.js 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.

    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function createTablePartitioned() {
      // Creates a new partitioned table named "my_table" in "my_dataset".
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = "my_dataset";
      // const tableId = "my_table";
      const schema = 'Name:string, Post_Abbr:string, Date:date';
    
      // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
      const options = {
        schema: schema,
        location: 'US',
        timePartitioning: {
          type: 'DAY',
          expirationMS: '7776000000',
          field: 'date',
        },
      };
    
      // Create a new table in the dataset
      const [table] = await bigquery
        .dataset(datasetId)
        .createTable(tableId, options);
      console.log(`Table ${table.id} created with partitioning: `);
      console.log(table.metadata.timePartitioning);
    }

    Python

    Antes de probar este ejemplo, sigue las Pythoninstrucciones 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 Python 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.

    from google.cloud import bigquery
    
    client = bigquery.Client()
    
    # Use format "your-project.your_dataset.your_table_name" for table_id
    table_id = your_fully_qualified_table_id
    schema = [
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
        bigquery.SchemaField("date", "DATE"),
    ]
    table = bigquery.Table(table_id, schema=schema)
    table.time_partitioning = bigquery.TimePartitioning(
        type_=bigquery.TimePartitioningType.DAY,
        field="date",  # name of column to use for partitioning
        expiration_ms=1000 * 60 * 60 * 24 * 90,
    )  # 90 days
    
    table = client.create_table(table)
    
    print(
        f"Created table {table.project}.{table.dataset_id}.{table.table_id}, "
        f"partitioned on column {table.time_partitioning.field}."
    )

Crear una tabla con particiones por hora de ingestión

Para crear una tabla con particiones por tiempo de ingestión vacía con una definición de esquema, sigue estos pasos:

Consola

  1. Abre la página de BigQuery en la Google Cloud consola.

    Ir a la página de BigQuery

  2. En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos.

  3. Abre la opción Acciones y haz clic en Abrir.

  4. En el panel de detalles, haz clic en Crear tabla .

  5. En la página Crear tabla, ve a la sección Fuente y selecciona Tabla vacía.

  6. En la sección Destino:

    • En Nombre del conjunto de datos, elige el conjunto de datos adecuado.
    • En el campo Nombre de la tabla, introduce el nombre de la tabla.
    • Verifica que el Tipo de tabla sea Tabla nativa.
  7. En la sección Schema (Esquema), introduce la definición de schema.

  8. En la sección Configuración de particiones y clústeres, en Partición, haz clic en Partición por tiempo de ingestión.

  9. (Opcional) Para requerir un filtro de partición en todas las consultas de esta tabla, seleccione la casilla Requerir filtro de partición. Si usas este filtro, es posible que rebajes los costes y mejores el rendimiento. Para obtener más información, consulta Definir los requisitos de los filtros de partición.

  10. Haz clic en Crear tabla.

SQL

Si quieres crear una tabla con particiones por hora de ingestión, usa laCREATE TABLE declaración con un elementoPARTITION BY cláusula que las particiones de_PARTITIONDATE en tu teléfono Android.

En el siguiente ejemplo se crea una tabla con particiones diarias:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

    CREATE TABLE
      mydataset.newtable (transaction_id INT64)
    PARTITION BY
      _PARTITIONDATE
      OPTIONS (
        partition_expiration_days = 3,
        require_partition_filter = TRUE);

    Usa la cláusula OPTIONS para definir opciones de tabla, como la caducidad de la partición y los requisitos del filtro de partición.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

El tipo de partición predeterminado para la partición por hora de ingestión es la partición diaria. Para especificar otro tipo de partición, incluye la función DATE_TRUNC en la cláusula PARTITION BY. Por ejemplo, la siguiente consulta crea una tabla con particiones mensuales:

CREATE TABLE
  mydataset.newtable (transaction_id INT64)
PARTITION BY
  DATE_TRUNC(_PARTITIONTIME, MONTH)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Usa el comando bq mk con la marca --table (o el acceso directo de -t):

    bq mk \
       --table \
       --schema SCHEMA \
       --time_partitioning_type UNIT_TIME \
       --time_partitioning_expiration EXPIRATION_TIME \
       --require_partition_filter=BOOLEAN  \
       PROJECT_ID:DATASET.TABLE

    Haz los cambios siguientes:

    • SCHEMA: una definición en el formato column:data_type,column:data_type o la ruta a un archivo de esquema JSON en tu máquina local. Para obtener más información, consulta Especificar un esquema.
    • UNIT_TIME: el tipo de partición. Los valores admitidos son DAY, HOUR, MONTH y YEAR.
    • EXPIRATION_TIME: el tiempo de vencimiento de las particiones de la tabla, en segundos. La marca --time_partitioning_expiration es opcional. Para obtener más información, consulta Establecer la caducidad de la partición.
    • BOOLEAN: Si true, las consultas en esta tabla deben incluir un filtro de partición. La marca --require_partition_filter es opcional. Para obtener más información, consulta Definir los requisitos de los filtros de partición.
    • PROJECT_ID: el ID del proyecto. Si se omite, se usará el proyecto predeterminado.
    • DATASET: el nombre de un conjunto de datos de tu proyecto.
    • TABLE: el nombre de la tabla que se va a crear.

    Para ver otras opciones de línea de comandos, consulta bq mk.

    En el siguiente ejemplo se crea una tabla con particiones por hora de ingestión llamada mytable. La tabla tiene particiones diarias, con un vencimiento de partición de 259.200 segundos (3 días).

    bq mk \
       -t \
       --schema qtr:STRING,sales:FLOAT,year:STRING \
       --time_partitioning_type DAY \
       --time_partitioning_expiration 259200 \
       mydataset.mytable
  3. Terraform

    Usa el recurso google_bigquery_table.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar la autenticación para bibliotecas de cliente.

    En el siguiente ejemplo se crea una tabla llamada mytable que tiene particiones por hora de ingestión:

    resource "google_bigquery_dataset" "default" {
      dataset_id                      = "mydataset"
      default_partition_expiration_ms = 2592000000  # 30 days
      default_table_expiration_ms     = 31536000000 # 365 days
      description                     = "dataset description"
      location                        = "US"
      max_time_travel_hours           = 96 # 4 days
    
      labels = {
        billing_group = "accounting",
        pii           = "sensitive"
      }
    }
    
    resource "google_bigquery_table" "default" {
      dataset_id          = google_bigquery_dataset.default.dataset_id
      table_id            = "mytable"
      deletion_protection = false # set to "true" in production
    
      time_partitioning {
        type          = "MONTH"
        expiration_ms = 604800000 # 7 days
      }
      require_partition_filter = true
    
      schema = <<EOF
    [
      {
        "name": "ID",
        "type": "INT64",
        "mode": "NULLABLE",
        "description": "Item ID"
      },
      {
        "name": "Item",
        "type": "STRING",
        "mode": "NULLABLE"
      }
    ]
    EOF
    
    }

    Para aplicar la configuración de Terraform en un proyecto, sigue los pasos que se indican en las siguientes secciones. Google Cloud

    Preparar Cloud Shell

    1. Abre Cloud Shell.
    2. Define el Google Cloud proyecto Google Cloud predeterminado en el que quieras aplicar tus configuraciones de Terraform.

      Solo tiene que ejecutar este comando una vez por proyecto y puede hacerlo en cualquier directorio.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.

    Preparar el directorio

    Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

    1. En Cloud Shell, crea un directorio y un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión .tf. Por ejemplo, main.tf. En este tutorial, nos referiremos al archivo como main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.

      Copia el código de ejemplo en el archivo main.tf que acabas de crear.

      También puedes copiar el código de GitHub. Se recomienda cuando el fragmento de Terraform forma parte de una solución integral.

    3. Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
    4. Guarda los cambios.
    5. Inicializa Terraform. Solo tienes que hacerlo una vez por directorio.
      terraform init

      Si quieres usar la versión más reciente del proveedor de Google, incluye la opción -upgrade:

      terraform init -upgrade

    Aplica los cambios

    1. Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
      terraform plan

      Haga las correcciones necesarias en la configuración.

    2. Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo yes en la petición:
      terraform apply

      Espera hasta que Terraform muestre el mensaje "Apply complete!".

    3. Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para asegurarte de que Terraform los ha creado o actualizado.

    API

    Llama al método tables.insert con un recurso de tabla definido que especifica la propiedad timePartitioning y la propiedad schema.

Crear una tabla con particiones de rangos de números enteros

Para crear una tabla con particiones de rangos de números enteros vacía con una definición de esquema, sigue estos pasos:

Consola

  1. Abre la página de BigQuery en la Google Cloud consola.

    Ir a la página de BigQuery

  2. En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos.

  3. Abre la opción Acciones y haz clic en Abrir.

  4. En el panel de detalles, haz clic en Crear tabla .

  5. En la página Crear tabla, ve a la sección Fuente y selecciona Tabla vacía.

  6. En la sección Destino:

    • En Nombre del conjunto de datos, elige el conjunto de datos adecuado.
    • En el campo Nombre de la tabla, introduce el nombre de la tabla.
    • Verifica que el Tipo de tabla sea Tabla nativa.
  7. En la sección Schema (Esquema), introduce la definición del esquema. Asegúrate de que el esquema incluya una columna INTEGER para la columna de partición. Para obtener más información, consulta Especificar un esquema.

  8. En la sección Configuración de particiones y clústeres, en la lista desplegable Partición, selecciona Partición por campo y elige la columna de partición. Esta opción solo está disponible si el esquema contiene una columna INTEGER.

  9. Proporciona valores para Inicio, Fin e Intervalo:

    • Start es el inicio del primer intervalo de partición (inclusive).
    • End es el final del último intervalo de partición (exclusivo).
    • Intervalo es la anchura de cada intervalo de partición.

    Los valores que no se incluyan en estos intervalos se añadirán a una partición especial __UNPARTITIONED__.

  10. (Opcional) Para requerir un filtro de partición en todas las consultas de esta tabla, seleccione la casilla Requerir filtro de partición. Si usas este filtro, es posible que rebajes los costes y mejores el rendimiento. Para obtener más información, consulta Definir los requisitos de los filtros de partición.

  11. Haz clic en Crear tabla.

SQL

Para crear una tabla con particiones de rangos de números enteros, usa la declaración de DDL CREATE TABLE con una cláusula PARTITION BY.

En el ejemplo siguiente se crea una tabla con particiones en la columna customer_id con los valores inicial 0, final 100 e intervalo 10:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

    CREATE TABLE mydataset.newtable (customer_id INT64, date1 DATE)
    PARTITION BY
      RANGE_BUCKET(customer_id, GENERATE_ARRAY(0, 100, 10))
      OPTIONS (
        require_partition_filter = TRUE);

    Usa la cláusula OPTIONS para definir opciones de tabla, como los requisitos del filtro de partición.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Usa el comando bq mk con la marca --table (o el acceso directo de -t):

    bq mk \
       --schema schema \
       --range_partitioning=COLUMN_NAME,START,END,INTERVAL \
       --require_partition_filter=BOOLEAN  \
       PROJECT_ID:DATASET.TABLE

    Haz los cambios siguientes:

    • SCHEMA: una definición de esquema insertada en el formato column:data_type,column:data_type o la ruta a un archivo de esquema JSON en tu máquina local. Para obtener más información, consulta Especificar un esquema.
    • COLUMN_NAME: el nombre de la columna de partición. En el esquema de la tabla, esta columna debe ser de tipo INTEGER.
    • START: inicio del primer intervalo de partición (inclusive).
    • END: el final del último intervalo de partición (exclusivo).
    • INTERVAL: ancho de cada intervalo de partición.
    • BOOLEAN: Si true, las consultas en esta tabla deben incluir un filtro de partición. La marca --require_partition_filter es opcional. Para obtener más información, consulta Definir los requisitos de los filtros de partición.
    • PROJECT_ID: el ID del proyecto. Si se omite, se usará el proyecto predeterminado.
    • DATASET: el nombre de un conjunto de datos de tu proyecto.
    • TABLE: el nombre de la tabla que se va a crear.

    Los valores que estén fuera del intervalo de la partición se incluirán en una partición __UNPARTITIONED__ especial.

    Para ver otras opciones de línea de comandos, consulta bq mk.

    En el ejemplo siguiente se crea una tabla llamada mytable que se particiona en la columna customer_id.

    bq mk \
       -t \
       --schema 'customer_id:INTEGER,qtr:STRING,sales:FLOAT' \
       --range_partitioning=customer_id,0,100,10 \
       mydataset.mytable
  3. Terraform

    Usa el recurso google_bigquery_table.

    Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar la autenticación para bibliotecas de cliente.

    En el siguiente ejemplo se crea una tabla llamada mytable que se particiona por intervalo de números enteros:

    resource "google_bigquery_dataset" "default" {
      dataset_id                      = "mydataset"
      default_partition_expiration_ms = 2592000000  # 30 days
      default_table_expiration_ms     = 31536000000 # 365 days
      description                     = "dataset description"
      location                        = "US"
      max_time_travel_hours           = 96 # 4 days
    
      labels = {
        billing_group = "accounting",
        pii           = "sensitive"
      }
    }
    
    resource "google_bigquery_table" "default" {
      dataset_id          = google_bigquery_dataset.default.dataset_id
      table_id            = "mytable"
      deletion_protection = false # set to "true" in production
    
      range_partitioning {
        field = "ID"
        range {
          start    = 0
          end      = 1000
          interval = 10
        }
      }
      require_partition_filter = true
    
      schema = <<EOF
    [
      {
        "name": "ID",
        "type": "INT64",
        "description": "Item ID"
      },
      {
        "name": "Item",
        "type": "STRING",
        "mode": "NULLABLE"
      }
    ]
    EOF
    
    }

    Para aplicar la configuración de Terraform en un proyecto, sigue los pasos que se indican en las siguientes secciones. Google Cloud

    Preparar Cloud Shell

    1. Abre Cloud Shell.
    2. Define el Google Cloud proyecto Google Cloud predeterminado en el que quieras aplicar tus configuraciones de Terraform.

      Solo tiene que ejecutar este comando una vez por proyecto y puede hacerlo en cualquier directorio.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.

    Preparar el directorio

    Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

    1. En Cloud Shell, crea un directorio y un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión .tf. Por ejemplo, main.tf. En este tutorial, nos referiremos al archivo como main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.

      Copia el código de ejemplo en el archivo main.tf que acabas de crear.

      También puedes copiar el código de GitHub. Se recomienda cuando el fragmento de Terraform forma parte de una solución integral.

    3. Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
    4. Guarda los cambios.
    5. Inicializa Terraform. Solo tienes que hacerlo una vez por directorio.
      terraform init

      Si quieres usar la versión más reciente del proveedor de Google, incluye la opción -upgrade:

      terraform init -upgrade

    Aplica los cambios

    1. Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
      terraform plan

      Haga las correcciones necesarias en la configuración.

    2. Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo yes en la petición:
      terraform apply

      Espera hasta que Terraform muestre el mensaje "Apply complete!".

    3. Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para asegurarte de que Terraform los ha creado o actualizado.

    API

    Llama al método tables.insert con un recurso de tabla definido que especifica la propiedad rangePartitioning y la propiedad schema.

    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.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Field;
    import com.google.cloud.bigquery.RangePartitioning;
    import com.google.cloud.bigquery.Schema;
    import com.google.cloud.bigquery.StandardSQLTypeName;
    import com.google.cloud.bigquery.StandardTableDefinition;
    import com.google.cloud.bigquery.TableId;
    import com.google.cloud.bigquery.TableInfo;
    
    // Sample to create a range partitioned table
    public class CreateRangePartitionedTable {
    
      public static void main(String[] args) {
        // TODO(developer): Replace these variables before running the sample.
        String datasetName = "MY_DATASET_NAME";
        String tableName = "MY_TABLE_NAME";
        Schema schema =
            Schema.of(
                Field.of("integerField", StandardSQLTypeName.INT64),
                Field.of("stringField", StandardSQLTypeName.STRING),
                Field.of("booleanField", StandardSQLTypeName.BOOL),
                Field.of("dateField", StandardSQLTypeName.DATE));
        createRangePartitionedTable(datasetName, tableName, schema);
      }
    
      public static void createRangePartitionedTable(
          String datasetName, String tableName, Schema schema) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          TableId tableId = TableId.of(datasetName, tableName);
    
          // Note: The field must be a top- level, NULLABLE/REQUIRED field.
          // The only supported type is INTEGER/INT64
          RangePartitioning partitioning =
              RangePartitioning.newBuilder()
                  .setField("integerField")
                  .setRange(
                      RangePartitioning.Range.newBuilder()
                          .setStart(1L)
                          .setInterval(2L)
                          .setEnd(10L)
                          .build())
                  .build();
    
          StandardTableDefinition tableDefinition =
              StandardTableDefinition.newBuilder()
                  .setSchema(schema)
                  .setRangePartitioning(partitioning)
                  .build();
          TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();
    
          bigquery.create(tableInfo);
          System.out.println("Range partitioned table created successfully");
        } catch (BigQueryException e) {
          System.out.println("Range partitioned table was not created. \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de probar este ejemplo, sigue las Node.jsinstrucciones 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 Node.js 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.

    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function createTableRangePartitioned() {
      // Creates a new integer range partitioned table named "my_table"
      // in "my_dataset".
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = "my_dataset";
      // const tableId = "my_table";
    
      const schema = [
        {name: 'fullName', type: 'STRING'},
        {name: 'city', type: 'STRING'},
        {name: 'zipcode', type: 'INTEGER'},
      ];
    
      // To use integer range partitioning, select a top-level REQUIRED or
      // NULLABLE column with INTEGER / INT64 data type. Values that are
      // outside of the range of the table will go into the UNPARTITIONED
      // partition. Null values will be in the NULL partition.
      const rangePartition = {
        field: 'zipcode',
        range: {
          start: 0,
          end: 100000,
          interval: 10,
        },
      };
    
      // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
      const options = {
        schema: schema,
        rangePartitioning: rangePartition,
      };
    
      // Create a new table in the dataset
      const [table] = await bigquery
        .dataset(datasetId)
        .createTable(tableId, options);
    
      console.log(`Table ${table.id} created with integer range partitioning: `);
      console.log(table.metadata.rangePartitioning);
    }

    Python

    Antes de probar este ejemplo, sigue las Pythoninstrucciones 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 Python 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.

    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    # TODO(developer): Set table_id to the ID of the table to create.
    # table_id = "your-project.your_dataset.your_table_name"
    
    schema = [
        bigquery.SchemaField("full_name", "STRING"),
        bigquery.SchemaField("city", "STRING"),
        bigquery.SchemaField("zipcode", "INTEGER"),
    ]
    
    table = bigquery.Table(table_id, schema=schema)
    table.range_partitioning = bigquery.RangePartitioning(
        # To use integer range partitioning, select a top-level REQUIRED /
        # NULLABLE column with INTEGER / INT64 data type.
        field="zipcode",
        range_=bigquery.PartitionRange(start=0, end=100000, interval=10),
    )
    table = client.create_table(table)  # Make an API request.
    print(
        "Created table {}.{}.{}".format(table.project, table.dataset_id, table.table_id)
    )

Crear una tabla con particiones a partir del resultado de una consulta

Puede crear una tabla particionada a partir del resultado de una consulta de las siguientes formas:

  • En SQL, usa una declaración CREATE TABLE ... AS SELECT. Puedes usar este método para crear una tabla con particiones por columnas de unidades de tiempo o por intervalos de números enteros, pero no por hora de ingestión.
  • Usa la herramienta de línea de comandos bq o la API de BigQuery para definir una tabla de destino para una consulta. Cuando se ejecuta la consulta, BigQuery escribe los resultados en la tabla de destino. Puedes usar este método con cualquier tipo de partición.
  • Llama al método de API jobs.insert y especifica la partición en la propiedad timePartitioning o en la propiedad rangePartitioning.

SQL

Usa la instrucción CREATE TABLE. Incluye una cláusula PARTITION BY para configurar la partición.

En el ejemplo siguiente se crea una tabla con particiones en la columna transaction_date:

  1. En la Google Cloud consola, ve a la página BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

    CREATE TABLE
      mydataset.newtable (transaction_id INT64, transaction_date DATE)
    PARTITION BY
      transaction_date
    AS (
      SELECT
        transaction_id, transaction_date
      FROM
        mydataset.mytable
    );

    Usa la cláusula OPTIONS para definir opciones de tabla, como los requisitos del filtro de partición.

  3. Haz clic en Ejecutar.

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para crear una tabla con particiones a partir de una consulta, usa el comando bq query con la marca --destination_table y la marca --time_partitioning_type.

    Partición por columnas de unidades de tiempo:

    bq query \
       --use_legacy_sql=false \
       --destination_table TABLE_NAME \
       --time_partitioning_field COLUMN \
       --time_partitioning_type UNIT_TIME \
       'QUERY_STATEMENT'

    Partición por hora de ingestión:

    bq query \
       --use_legacy_sql=false \
       --destination_table TABLE_NAME \
       --time_partitioning_type UNIT_TIME \
       'QUERY_STATEMENT'

    Particiones de rangos de números enteros:

    bq query \
       --use_legacy_sql=false \
       --destination_table PROJECT_ID:DATASET.TABLE \
       --range_partitioning COLUMN,START,END,INTERVAL \
       'QUERY_STATEMENT'

    Haz los cambios siguientes:

    • PROJECT_ID: el ID del proyecto. Si se omite, se usará el proyecto predeterminado.
    • DATASET: el nombre de un conjunto de datos de tu proyecto.
    • TABLE: el nombre de la tabla que se va a crear.
    • COLUMN: el nombre de la columna de partición.
    • UNIT_TIME: el tipo de partición. Los valores admitidos son DAY, HOUR, MONTH o YEAR.
    • START: el inicio de la partición por rango (inclusive).
    • END: el final de la partición por rango, exclusivo.
    • INTERVAL: ancho de cada intervalo de la partición.
    • QUERY_STATEMENT: la consulta utilizada para rellenar la tabla.

    En el ejemplo siguiente se crea una tabla con particiones en la columna transaction_date, con particiones mensuales.

    bq query \
       --use_legacy_sql=false \
       --destination_table mydataset.newtable \
       --time_partitioning_field transaction_date \
       --time_partitioning_type MONTH \
       'SELECT transaction_id, transaction_date FROM mydataset.mytable'

    En el ejemplo siguiente se crea una tabla con particiones en la columna customer_id mediante particiones de rangos de números enteros.

    bq query \
       --use_legacy_sql=false \
       --destination_table mydataset.newtable \
       --range_partitioning customer_id,0,100,10 \
       'SELECT * FROM mydataset.ponies'

    En el caso de las tablas con particiones por hora de ingestión, también puedes cargar datos en una partición específica mediante un decorador de partición. En el siguiente ejemplo se crea una tabla con particiones por hora de ingestión y se cargan datos en la partición 20180201 (1 de febrero del 2018):

    bq query \
       --use_legacy_sql=false  \
       --time_partitioning_type=DAY \
       --destination_table='newtable$20180201' \
       'SELECT * FROM mydataset.mytable'
  3. API

    Para guardar los resultados de una consulta en una tabla con particiones, llama al método jobs.insert. Configura una tarea query. Especifica la tabla de destino en destinationTable. Especifica la partición en la propiedad timePartitioning o en la propiedad rangePartitioning.

Convertir tablas con particiones por fecha en tablas con particiones por hora de ingestión

Si has creado tablas con particiones por fecha, puedes convertir todo el conjunto de tablas relacionadas en una sola tabla con particiones por tiempo de ingestión mediante el comando partition en la herramienta de línea de comandos bq.

bq --location=LOCATION partition \
    --time_partitioning_type=PARTITION_TYPE \
    --time_partitioning_expiration INTEGER \
    PROJECT_ID:SOURCE_DATASET.SOURCE_TABLE \
    PROJECT_ID:DESTINATION_DATASET.DESTINATION_TABLE

Haz los cambios siguientes:

  • LOCATION: el nombre de tu ubicación. La marca --location es opcional.
  • PARTITION_TYPE: el tipo de partición. Los valores posibles son DAY, HOUR, MONTH o YEAR.
  • INTEGER: tiempo de caducidad de la partición, en segundos. No hay ningún valor mínimo. El tiempo de vencimiento se evalúa como la fecha UTC de la partición más el valor entero. La marca time_partitioning_expiration es opcional.
  • PROJECT_ID: tu ID de proyecto.
  • SOURCE_DATASET: el conjunto de datos que contiene las tablas particionadas por fecha.
  • SOURCE_TABLE: el prefijo de las tablas particionadas por fecha.
  • DESTINATION_DATASET: el conjunto de datos de la nueva tabla particionada.
  • DESTINATION_TABLE; nombre de la tabla con particiones que se va a crear.

El comando partition no admite las marcas --label, --expiration, --add_tags ni --description. Una vez creada la tabla, puedes añadirle etiquetas, una fecha de vencimiento, etiquetas y una descripción.

Cuando ejecutas el comando partition, BigQuery crea un trabajo de copia que genera particiones a partir de las tablas fragmentadas.

En el siguiente ejemplo se crea una tabla con particiones por hora de ingestión llamada mytable_partitioned a partir de un conjunto de tablas fragmentadas por fecha con el prefijo sourcetable_. La nueva tabla se particiona a diario, con una caducidad de partición de 259.200 segundos (3 días).

bq partition \
    --time_partitioning_type=DAY \
    --time_partitioning_expiration 259200 \
    mydataset.sourcetable_ \
    mydataset.mytable_partitioned

Si las tablas fragmentadas por fecha fueran sourcetable_20180126 y sourcetable_20180127, este comando crearía las siguientes particiones: mydataset.mytable_partitioned$20180126 y mydataset.mytable_partitioned$20180127.

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.

Siguientes pasos