Cargar datos CSV de Cloud Storage

Cuando cargas datos CSV desde Cloud Storage, puedes hacerlo en una tabla o partición nuevas, o bien puedes añadirlos a una tabla o partición ya creadas o sobrescribirlas. Cuando tus datos se cargan en BigQuery, se convierten al formato de columnas de Capacitor (el formato de almacenamiento de BigQuery).

Cuando cargas datos de Cloud Storage en una tabla de BigQuery, el conjunto de datos que contiene la tabla debe estar en la misma ubicación regional o multirregional que el segmento de Cloud Storage.

Para obtener información sobre cómo cargar datos CSV desde un archivo local, consulta el artículo Cargar datos en BigQuery desde una fuente de datos local.

Pruébalo

Si es la primera vez que utilizas Google Cloud, crea una cuenta para evaluar el rendimiento de BigQuery en situaciones reales. Los nuevos clientes también reciben 300 USD en crédito gratuito para ejecutar, probar y desplegar cargas de trabajo.

Probar BigQuery gratis

Limitaciones

Cuando cargas datos en BigQuery desde un segmento de Cloud Storage, estás sujeto a las siguientes limitaciones:

  • BigQuery no garantiza la coherencia de los datos de las fuentes de datos externas. Si se modifican los datos subyacentes mientras se ejecuta una consulta, se pueden producir comportamientos inesperados.
  • BigQuery no admite la gestión de versiones de objetos de Cloud Storage. Si incluyes un número de generación en el URI de Cloud Storage, el trabajo de carga fallará.

Cuando cargues archivos CSV en BigQuery, ten en cuenta lo siguiente:

  • Los archivos CSV no admiten datos anidados ni repetidos.
  • Quita los caracteres de marca de orden de bytes (BOM). Pueden provocar problemas inesperados.
  • Si usa la compresión gzip, BigQuery no podrá leer los datos en paralelo. Cargar datos CSV comprimidos en BigQuery es más lento que cargar datos sin comprimir. Consulta Cargar datos comprimidos y sin comprimir.
  • No puedes incluir archivos comprimidos y sin comprimir en el mismo trabajo de carga.
  • El tamaño máximo de un archivo gzip es de 4 GB.
  • Al cargar datos CSV mediante la detección automática de esquemas, no se detectan automáticamente los encabezados si todas las columnas son de tipo cadena. En este caso, añade una columna numérica a la entrada o declara el esquema explícitamente.
  • Cuando cargues datos CSV o JSON, los valores de las columnas DATE deben usar el guion (-) como separador y la fecha debe tener el siguiente formato: YYYY-MM-DD (año-mes-día).
  • Cuando cargues datos JSON o CSV, los valores de las columnas TIMESTAMP deben usar un guion (-) o una barra (/) como separador en la parte de la fecha de la marca de tiempo. Además, la fecha debe tener uno de los siguientes formatos: YYYY-MM-DD (año-mes-día) o YYYY/MM/DD (año/mes/día). La parte hh:mm:ss (hora-minuto-segundo) de la marca de tiempo debe usar dos puntos (:) como separador.
  • Los archivos deben cumplir los límites de tamaño de los archivos CSV que se describen en los límites de los trabajos de carga.

Antes de empezar

Asigna roles de gestión de identidades y accesos (IAM) que proporcionen a los usuarios los permisos necesarios para realizar cada tarea de este documento y crea un conjunto de datos para almacenar tus datos.

Permisos obligatorios

Para cargar datos en BigQuery, necesitas permisos de gestión de identidades y accesos para ejecutar un trabajo de carga y cargar datos en tablas y particiones de BigQuery. Si cargas datos desde Cloud Storage, también necesitas permisos de IAM para acceder al segmento que contiene tus datos.

Permisos para cargar datos en BigQuery

Para cargar datos en una tabla o partición de BigQuery, o bien para añadir o sobrescribir una tabla o partición, necesitas los siguientes permisos de gestión de identidades y accesos:

  • bigquery.tables.create
  • bigquery.tables.updateData
  • bigquery.tables.update
  • bigquery.jobs.create

Cada uno de los siguientes roles de gestión de identidades y accesos predefinidos incluye los permisos que necesitas para cargar datos en una tabla o partición de BigQuery:

  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • roles/bigquery.admin (incluye el permiso bigquery.jobs.create)
  • bigquery.user (incluye el permiso bigquery.jobs.create)
  • bigquery.jobUser (incluye el permiso bigquery.jobs.create)

Además, si tienes el permiso bigquery.datasets.create, puedes crear y actualizar tablas mediante un trabajo de carga en los conjuntos de datos que crees.

Para obtener más información sobre los roles y permisos de IAM en BigQuery, consulta el artículo sobre funciones y permisos predefinidos.

Permisos para cargar datos desde Cloud Storage

Para obtener los permisos que necesitas para cargar datos desde un segmento de Cloud Storage, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de Storage (roles/storage.admin) en el segmento. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para cargar datos desde un segmento de Cloud Storage. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para cargar datos desde un segmento de Cloud Storage, se necesitan los siguientes permisos:

  • storage.buckets.get
  • storage.objects.get
  • storage.objects.list (required if you are using a URI wildcard)

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

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tus datos.

Compresión de CSV

Puede usar la utilidad gzip para comprimir archivos CSV. Ten en cuenta que gzip realiza una compresión completa de los archivos, a diferencia de la compresión del contenido de los archivos que realizan los códecs de compresión para otros formatos de archivo, como Avro. Usar gzip para comprimir tus archivos CSV puede afectar al rendimiento. Para obtener más información sobre las ventajas y desventajas, consulta Cargar datos comprimidos y sin comprimir.

Cargar datos de CSV en una tabla

Para cargar datos CSV de Cloud Storage en una tabla de BigQuery, seleccione una de las siguientes opciones:

Consola


Para seguir las instrucciones paso a paso de esta tarea directamente en el editor de Cloud Shell, haz clic en Ayúdame:

Guíame


  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 Google Cloud Storage en la lista Crear tabla a partir de. A continuación, siga estos pasos:
      1. Selecciona un archivo del segmento de Cloud Storage o introduce el URI de Cloud Storage. No puedes incluir varias URIs en la consola Google Cloud , pero sí caracteres comodín. El segmento de Cloud Storage debe estar en la misma ubicación que el conjunto de datos que contiene la tabla que quieres crear, añadir o sobrescribir. Seleccionar el archivo de origen para crear una tabla de BigQuery
      2. En Formato de archivo, selecciona CSV.
    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. Para habilitar la detección automática de un esquema, selecciona Detectar automáticamente. 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. Opcional: Especifica la configuración de partición y clúster. Para obtener más información, consulta los artículos sobre cómo crear tablas con particiones y cómo crear y usar tablas agrupadas en clústeres.
    5. Haz clic en Opciones avanzadas y haz lo siguiente:
      • En Write preference (Preferencia de escritura), deja seleccionada la opción Write if empty (Escribir si está vacía). Con esta opción se crea una tabla y se cargan los datos en ella.
      • En Número de errores permitidos, acepta el valor predeterminado 0 o introduce el número máximo de filas que contengan errores que se pueden ignorar. Si el número de filas con errores supera este valor, el trabajo mostrará un mensaje invalid y fallará. Esta opción solo se aplica a los archivos CSV y JSON.
      • En Zona horaria, introduzca la zona horaria predeterminada que se aplicará al analizar los valores de marca de tiempo que no tengan una zona horaria específica. Consulta aquí más nombres de zonas horarias válidos. Si no se incluye este valor, las marcas de tiempo sin una zona horaria específica se analizan con la zona horaria predeterminada UTC. Vista previa.
      • En Formato de fecha, introduce los elementos de formato que definen cómo se formatean los valores DATE en los archivos de entrada. Este campo espera el formato de estilos SQL (por ejemplo, MM/DD/YYYY). Si este valor está presente, este formato es el único compatible con DATE. La detección automática de esquemas también decidirá el tipo de columna DATE en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo DATE se analiza con los formatos predeterminados. Vista previa.
      • En Formato de fecha y hora, introduce los elementos de formato que definen cómo se formatean los valores DATETIME en los archivos de entrada. Este campo espera el formato de estilos SQL (por ejemplo, MM/DD/YYYY HH24:MI:SS.FF3). Si se incluye este valor, este formato será el único compatible con DATETIME. La detección automática de esquemas también decidirá el tipo de columna DATETIME en función de este formato en lugar del formato actual. Si este valor no está presente, el campo DATETIME se analiza con los formatos predeterminados. Vista previa.
      • En Formato de hora, introduzca los elementos de formato que definen cómo se formatean los valores TIME en los archivos de entrada. Este campo espera el formato de estilos SQL (por ejemplo, HH24:MI:SS.FF3). Si se incluye este valor, será el único formato TIME compatible. La detección automática de esquemas también determinará el tipo de columna TIME en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo TIME se analiza con los formatos predeterminados. Vista previa.
      • En Formato de marca de tiempo, introduzca los elementos de formato que definen cómo se formatean los valores TIMESTAMP en los archivos de entrada. Este campo espera el formato de estilos SQL (por ejemplo, MM/DD/YYYY HH24:MI:SS.FF3). Si se incluye este valor, este formato será el único compatible con TIMESTAMP. La detección automática de esquemas también determinará el tipo de columna TIMESTAMP en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo TIMESTAMP se analiza con los formatos predeterminados. Vista previa.
      • Si quieres ignorar los valores de una fila que no estén presentes en el esquema de la tabla, selecciona Valores desconocidos.
      • En Delimitador de campos, elige el carácter que separa las celdas de tu archivo CSV: Coma, Tabulación, Barra vertical o Personalizado. Si elige Personalizado, introduzca el delimitador en el cuadro Delimitador de campo personalizado. El valor predeterminado es Coma.
      • En Coincidencia de columnas de origen, elija una de las siguientes estrategias para asociar las columnas cargadas al esquema (Vista previa).
        • Default: el comportamiento predeterminado se elige en función de cómo se proporcione el esquema. Si la detección automática está habilitada, el comportamiento predeterminado es hacer coincidir las columnas por nombre. De lo contrario, las columnas se emparejarán por posición de forma predeterminada. Esto se hace para mantener la retrocompatibilidad.
        • Position: hace coincidir las columnas por posición, suponiendo que las columnas están ordenadas de la misma forma que el esquema.
        • Name: se basa en el nombre. Para ello, lee la fila de encabezado como los nombres de las columnas y reordena las columnas para que coincidan con los nombres de los campos del esquema. Los nombres de las columnas se leen de la última fila omitida en función de Filas de encabezado que se van a omitir.
      • En Filas de encabezado que se deben omitir, introduce el número de filas de encabezado que se deben omitir en la parte superior del archivo CSV. El valor predeterminado es 0.
      • En Saltos de línea entrecomillados, marca Permitir saltos de línea entrecomillados para permitir secciones de datos entrecomilladas que contengan caracteres de salto de línea en un archivo CSV. El valor predeterminado es false.
      • En Filas escalonadas, marca Permitir filas escalonadas para aceptar filas en archivos CSV a las que les falten columnas opcionales finales. Los valores que faltan se tratan como nulos. Si no se marca, los registros a los que les faltan columnas finales se tratan como registros incorrectos y, si hay demasiados, se devuelve un error no válido en el resultado del trabajo. El valor predeterminado es false.
      • En Marcadores nulos, introduce una lista de cadenas personalizadas que representen un valor NULL en los datos CSV. Vista previa.
      • En Encriptado, haz clic en Clave gestionada por el cliente para usar una clave de Cloud Key Management Service. Si dejas el ajuste Google-managed key, BigQuery cifra los datos en reposo.
    6. Haz clic en Crear tabla.

SQL

Usa la LOAD DATA instrucción DDL. En el siguiente ejemplo se carga un archivo CSV en la nueva tabla mytable:

  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:

    LOAD DATA OVERWRITE mydataset.mytable
    (x INT64,y STRING)
    FROM FILES (
      format = 'CSV',
      uris = ['gs://bucket/path/file.csv']);

  3. 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 load, especifica CSV con la marca --source_format e incluye un URI de Cloud Storage. Puede incluir un solo URI, una lista de URIs separados por comas o un URI que contenga un comodín. Proporciona el esquema de forma insertada, en un archivo de definición de esquema o usa la detección automática de esquemas. Si no especifica un esquema, --autodetect es false y la tabla de destino existe, se usará el esquema de la tabla de destino.

(Opcional) Proporcione la marca --location y asigne el valor a su ubicación.

Otras marcas opcionales son:

  • --allow_jagged_rows: cuando se especifica, acepta las filas de los archivos CSV a las que les faltan columnas opcionales finales. Los valores que faltan se tratan como nulos. Si no se marca, los registros a los que les faltan columnas finales se tratan como registros incorrectos y, si hay demasiados registros incorrectos, se devuelve un error no válido en el resultado del trabajo. El valor predeterminado es false.
  • --allow_quoted_newlines: cuando se especifica, permite secciones de datos entre comillas que contienen caracteres de salto de línea en un archivo CSV. El valor predeterminado es false.
  • --field_delimiter: carácter que indica el límite entre las columnas de los datos. Se pueden usar tanto \t como tab para delimitar las pestañas. El valor predeterminado es ,.
  • --null_marker: cadena personalizada opcional que representa un valor NULL en los datos CSV.
  • --null_markers: (Vista previa) Lista opcional separada por comas de cadenas personalizadas que representan valores NULL en datos CSV. Esta opción no se puede usar con la marca --null_marker.
  • --source_column_match: (Vista previa) Especifica la estrategia utilizada para asociar las columnas cargadas al esquema. Puedes especificar POSITION para que coincidan las columnas cargadas por posición, siempre que las columnas estén ordenadas de la misma forma que el esquema. También puede especificar NAME para que se haga la coincidencia por nombre leyendo la fila de encabezado como los nombres de las columnas y reordenando las columnas para que coincidan con los nombres de los campos del esquema. Si no se especifica ningún valor, el valor predeterminado se basa en cómo se proporciona el esquema. Si --autodetect está habilitada, el comportamiento predeterminado es hacer coincidir las columnas por nombre. De lo contrario, las columnas se emparejarán por posición de forma predeterminada.
  • --skip_leading_rows: especifica el número de filas de encabezado que se deben omitir en la parte superior del archivo CSV. El valor predeterminado es 0.
  • --quote: carácter de comillas que se usa para delimitar los registros. El valor predeterminado es ". Para indicar que no hay ningún carácter de comillas, usa una cadena vacía.
  • --max_bad_records: número entero que especifica el número máximo de registros incorrectos que se permiten antes de que falle todo el trabajo. El valor predeterminado es 0. Se devuelven como máximo cinco errores de cualquier tipo, independientemente del valor de --max_bad_records.
  • --ignore_unknown_values: cuando se especifica, permite e ignora los valores adicionales no reconocidos en los datos CSV o JSON.
  • --time_zone: (Vista previa) Una zona horaria predeterminada opcional que se aplicará al analizar los valores de marca de tiempo que no tengan una zona horaria específica en los datos CSV o JSON.
  • --date_format: (Vista previa) Cadena personalizada opcional que define cómo se formatean los valores DATE en los datos CSV o JSON.
  • --datetime_format: (Vista previa) Cadena personalizada opcional que define cómo se formatean los valores DATETIME en los datos CSV o JSON.
  • --time_format: (Vista previa) Cadena personalizada opcional que define cómo se formatean los valores de TIME en los datos CSV o JSON.
  • --timestamp_format: (Vista previa) Cadena personalizada opcional que define el formato de los valores TIMESTAMP en los datos CSV o JSON.
  • --autodetect: Cuando se especifica, habilita la detección automática de esquemas para datos CSV y JSON.
  • --time_partitioning_type: habilita la creación de particiones basadas en el tiempo en una tabla y define el tipo de partición. Los valores posibles son HOUR, DAY, MONTH y YEAR. Esta marca es opcional cuando se crea una tabla con particiones en una columna DATE, DATETIME o TIMESTAMP. El tipo de partición predeterminado para la partición basada en tiempo es DAY. No puedes cambiar la especificación de partición de una tabla que ya tengas.
  • --time_partitioning_expiration: número entero que especifica (en segundos) cuándo se debe eliminar una partición basada en el tiempo. El tiempo de caducidad se calcula como la fecha UTC de la partición más el valor entero.
  • --time_partitioning_field: columna DATE o TIMESTAMP que se usa para crear una tabla con particiones. Si se habilita la creación de particiones basadas en tiempo sin este valor, se creará una tabla con particiones por hora de ingestión.
  • --require_partition_filter: cuando se habilita esta opción, los usuarios deben incluir una cláusula WHERE que especifique las particiones que se van a consultar. Si usas este filtro, es posible que rebajes los costes y mejores el rendimiento. Para obtener más información, consulta Consultar tablas particionadas.
  • --clustering_fields: lista separada por comas de hasta cuatro nombres de columna que se usa para crear una tabla agrupada en clústeres.
  • --destination_kms_key: la clave de Cloud KMS para cifrar los datos de la tabla.
  • --column_name_character_map: define el ámbito y la gestión de los caracteres en los nombres de las columnas, con la opción de habilitar nombres de columnas flexibles. Requiere la opción --autodetect para archivos CSV. Para obtener más información, consulta load_option_list.

    Para obtener más información sobre el comando bq load, consulta lo siguiente:

    Para obtener más información sobre las tablas con particiones, consulta los siguientes artículos:

    Para obtener más información sobre las tablas agrupadas en clústeres, consulta los siguientes enlaces:

    Para obtener más información sobre el cifrado de tablas, consulta los siguientes artículos:

Para cargar datos CSV en BigQuery, introduce el siguiente comando:

bq --location=location load \
--source_format=format \
dataset.table \
path_to_source \
schema

Donde:

  • location es tu ubicación. La marca --location es opcional. Por ejemplo, si usas BigQuery en la región de Tokio, puedes definir el valor de la marca como asia-northeast1. Puedes definir un valor predeterminado para la ubicación mediante el archivo.bigqueryrc.
  • format es CSV.
  • dataset es un conjunto de datos.
  • table es el nombre de la tabla en la que se cargan los datos.
  • path_to_source es un URI de Cloud Storage completo o una lista de URIs separados por comas. También se admiten comodines.
  • schema es un esquema válido. El esquema puede ser un archivo JSON local o se puede escribir directamente como parte del comando. También puedes usar la marca --autodetect en lugar de proporcionar una definición de esquema.

Ejemplos:

El siguiente comando carga datos de gs://mybucket/mydata.csv en una tabla llamada mytable en mydataset. El esquema se define en un archivo de esquema local llamado myschema.json.

    bq load \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

El siguiente comando carga datos de gs://mybucket/mydata.csv en una tabla llamada mytable en mydataset. El esquema se define en un archivo de esquema local llamado myschema.json. El archivo CSV incluye dos filas de encabezado. Si no se especifica --skip_leading_rows, el comportamiento predeterminado es asumir que el archivo no contiene encabezados.

    bq load \
    --source_format=CSV \
    --skip_leading_rows=2
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

El siguiente comando carga datos de gs://mybucket/mydata.csv en una tabla con particiones por tiempo de ingestión llamada mytable en mydataset. El esquema se define en un archivo de esquema local llamado myschema.json.

    bq load \
    --source_format=CSV \
    --time_partitioning_type=DAY \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

El siguiente comando carga datos de gs://mybucket/mydata.csv en una tabla particionada nueva llamada mytable en mydataset. que cuenta con particiones por la columna mytimestamp. El esquema se define en un archivo de esquema local llamado myschema.json.

    bq load \
    --source_format=CSV \
    --time_partitioning_field mytimestamp \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

El siguiente comando carga datos de gs://mybucket/mydata.csv en una tabla llamada mytable en mydataset. El esquema se detecta automáticamente.

    bq load \
    --autodetect \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv

El siguiente comando carga datos de gs://mybucket/mydata.csv en una tabla llamada mytable en mydataset. El esquema se define de forma insertada en el formato field:data_type,field:data_type.

    bq load \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    qtr:STRING,sales:FLOAT,year:STRING
RECORD

El siguiente comando carga datos de varios archivos de gs://mybucket/ en una tabla llamada mytable de mydataset. El URI de Cloud Storage usa un comodín. El esquema se detecta automáticamente.

    bq load \
    --autodetect \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata*.csv

El siguiente comando carga datos de varios archivos de gs://mybucket/ en una tabla llamada mytable de mydataset. El comando incluye una lista de URIs de Cloud Storage separados por comas con comodines. El esquema se define en un archivo de esquema local llamado myschema.json.

    bq load \
    --source_format=CSV \
    mydataset.mytable \
    "gs://mybucket/00/*.csv","gs://mybucket/01/*.csv" \
    ./myschema.json

API

  1. Crea una tarea load que apunte a los datos de origen en Cloud Storage.

  2. (Opcional) Especifica tu ubicación en la propiedad location de la sección jobReference del recurso de empleo.

  3. La propiedad source URIs debe estar totalmente cualificada y tener el formato gs://bucket/object. Cada URI puede contener un carácter comodín "*".

  4. Especifica el formato de los datos CSV asignando el valor CSV a la propiedad sourceFormat.

  5. Para comprobar el estado del trabajo, llama a jobs.get(job_id*), donde job_id es el ID del trabajo devuelto por la solicitud inicial.

    • Si status.state = DONE, el trabajo se ha completado correctamente.
    • Si la propiedad status.errorResult está presente, significa que se ha producido un error en la solicitud y que el objeto incluirá información que describe lo que ha fallado. Si una solicitud falla, no se crea ninguna tabla y no se cargan datos.
    • Si no aparece status.errorResult, significa que el trabajo se ha completado correctamente, aunque puede que se hayan producido algunos errores no graves, como problemas al importar algunas filas. Los errores no críticos se indican en la propiedad status.errors del objeto job devuelto.

Notas sobre la API:

  • Las tareas de carga son atómicas y coherentes: si una tarea de carga falla, no habrá datos disponibles, y si se completa correctamente, todos los datos estarán disponibles.

  • Como práctica recomendada, genera un ID único y pásalo como jobReference.jobId al llamar a jobs.insert para crear un trabajo de carga. Este enfoque es más sólido ante fallos de red, ya que el cliente puede sondear o volver a intentar la operación con el ID de trabajo conocido.

  • Llamar a jobs.insert en un ID de trabajo determinado es idempotente. Puedes volver a intentarlo tantas veces como quieras con el mismo ID de trabajo y, como máximo, una de esas operaciones se completará correctamente.

C#

Antes de probar este ejemplo, sigue las C#instrucciones 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 C# 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.


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryLoadTableGcsCsv
{
    public void LoadTableGcsCsv(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        var gcsURI = "gs://cloud-samples-data/bigquery/us-states/us-states.csv";
        var dataset = client.GetDataset(datasetId);
        var schema = new TableSchemaBuilder {
            { "name", BigQueryDbType.String },
            { "post_abbr", BigQueryDbType.String }
        }.Build();
        var destinationTableRef = dataset.GetTableReference(
            tableId: "us_states");
        // Create job configuration
        var jobOptions = new CreateLoadJobOptions()
        {
            // The source format defaults to CSV; line below is optional.
            SourceFormat = FileFormat.Csv,
            SkipLeadingRows = 1
        };
        // Create and run job
        var loadJob = client.CreateLoadJob(
            sourceUri: gcsURI, destination: destinationTableRef,
            schema: schema, options: jobOptions);
        loadJob = loadJob.PollUntilCompleted().ThrowOnAnyError();  // Waits for the job to complete.

        // Display the number of rows uploaded
        BigQueryTable table = client.GetTable(destinationTableRef);
        Console.WriteLine(
            $"Loaded {table.Resource.NumRows} rows to {table.FullyQualifiedId}");
    }
}

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"

	"cloud.google.com/go/bigquery"
)

// importCSVExplicitSchema demonstrates loading CSV data from Cloud Storage into a BigQuery
// table and providing an explicit schema for the data.
func importCSVExplicitSchema(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.csv")
	gcsRef.SkipLeadingRows = 1
	gcsRef.Schema = bigquery.Schema{
		{Name: "name", Type: bigquery.StringFieldType},
		{Name: "post_abbr", Type: bigquery.StringFieldType},
	}
	loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
	loader.WriteDisposition = bigquery.WriteEmpty

	job, err := loader.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}

	if status.Err() != nil {
		return fmt.Errorf("job completed with error: %v", status.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.CsvOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.TableId;

// Sample to load CSV data from Cloud Storage into a new BigQuery table
public class LoadCsvFromGcs {

  public static void runLoadCsvFromGcs() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv";
    Schema schema =
        Schema.of(
            Field.of("name", StandardSQLTypeName.STRING),
            Field.of("post_abbr", StandardSQLTypeName.STRING));
    loadCsvFromGcs(datasetName, tableName, sourceUri, schema);
  }

  public static void loadCsvFromGcs(
      String datasetName, String tableName, String sourceUri, 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();

      // Skip header row in the file.
      CsvOptions csvOptions = CsvOptions.newBuilder().setSkipLeadingRows(1).build();

      TableId tableId = TableId.of(datasetName, tableName);
      LoadJobConfiguration loadConfig =
          LoadJobConfiguration.newBuilder(tableId, sourceUri, csvOptions).setSchema(schema).build();

      // Load data from a GCS CSV file into the table
      Job job = bigquery.create(JobInfo.of(loadConfig));
      // Blocks until this load table job completes its execution, either failing or succeeding.
      job = job.waitFor();
      if (job.isDone()) {
        System.out.println("CSV from GCS successfully added during load append job");
      } else {
        System.out.println(
            "BigQuery was unable to load into the table due to an error:"
                + job.getStatus().getError());
      }
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Column not added during load append \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 libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');

// Instantiate clients
const bigquery = new BigQuery();
const storage = new Storage();

/**
 * This sample loads the CSV file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.csv
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.csv';

async function loadCSVFromGCS() {
  // Imports a GCS file into a table with manually defined schema.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad
  const metadata = {
    sourceFormat: 'CSV',
    skipLeadingRows: 1,
    schema: {
      fields: [
        {name: 'name', type: 'STRING'},
        {name: 'post_abbr', type: 'STRING'},
      ],
    },
    location: 'US',
  };

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .load(storage.bucket(bucketName).file(filename), metadata);

  // load() waits for the job to finish
  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId  = 'The Google project ID';
// $datasetId  = 'The BigQuery dataset ID';

// instantiate the bigquery table service
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table('us_states');

// create the import job
$gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.csv';
$schema = [
    'fields' => [
        ['name' => 'name', 'type' => 'string'],
        ['name' => 'post_abbr', 'type' => 'string']
    ]
];
$loadConfig = $table->loadFromStorage($gcsUri)->schema($schema)->skipLeadingRows(1);
$job = $table->runJob($loadConfig);
// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Data imported successfully' . PHP_EOL);
}

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.

Usa el método Client.load_table_from_uri() para cargar datos de un archivo CSV en Cloud Storage. Proporciona una definición de esquema explícita asignando a la propiedad LoadJobConfig.schema una lista de objetos SchemaField.

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"

job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
    ],
    skip_leading_rows=1,
    # The source format defaults to CSV, so the line below is optional.
    source_format=bigquery.SourceFormat.CSV,
)
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv"

load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Waits for the job to complete.

destination_table = client.get_table(table_id)  # Make an API request.
print("Loaded {} rows.".format(destination_table.num_rows))

Ruby

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

require "google/cloud/bigquery"

def load_table_gcs_csv dataset_id = "your_dataset_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  gcs_uri  = "gs://cloud-samples-data/bigquery/us-states/us-states.csv"
  table_id = "us_states"

  load_job = dataset.load_job table_id, gcs_uri, skip_leading: 1 do |schema|
    schema.string "name"
    schema.string "post_abbr"
  end
  puts "Starting job #{load_job.job_id}"

  load_job.wait_until_done! # Waits for table load to complete.
  puts "Job finished."

  table = dataset.table table_id
  puts "Loaded #{table.rows_count} rows to table #{table.id}"
end

Cargar datos CSV en una tabla que usa particiones por hora basadas en columnas

Para cargar datos CSV de Cloud Storage en una tabla de BigQuery que use particiones de tiempo basadas en columnas, sigue estos pasos:

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"
)

// importPartitionedTable demonstrates specifing time partitioning for a BigQuery table when loading
// CSV data from Cloud Storage.
func importPartitionedTable(projectID, destDatasetID, destTableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states-by-date.csv")
	gcsRef.SkipLeadingRows = 1
	gcsRef.Schema = bigquery.Schema{
		{Name: "name", Type: bigquery.StringFieldType},
		{Name: "post_abbr", Type: bigquery.StringFieldType},
		{Name: "date", Type: bigquery.DateFieldType},
	}
	loader := client.Dataset(destDatasetID).Table(destTableID).LoaderFrom(gcsRef)
	loader.TimePartitioning = &bigquery.TimePartitioning{
		Field:      "date",
		Expiration: 90 * 24 * time.Hour,
	}
	loader.WriteDisposition = bigquery.WriteEmpty

	job, err := loader.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}

	if status.Err() != nil {
		return fmt.Errorf("job completed with error: %v", status.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.FormatOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TimePartitioning;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.UUID;

public class LoadPartitionedTable {

  public static void runLoadPartitionedTable() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String sourceUri = "/path/to/file.csv";
    loadPartitionedTable(datasetName, tableName, sourceUri);
  }

  public static void loadPartitionedTable(String datasetName, String tableName, String sourceUri)
      throws Exception {
    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);

      Schema schema =
          Schema.of(
              Field.of("name", StandardSQLTypeName.STRING),
              Field.of("post_abbr", StandardSQLTypeName.STRING),
              Field.of("date", StandardSQLTypeName.DATE));

      // Configure time partitioning. For full list of options, see:
      // https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#TimePartitioning
      TimePartitioning partitioning =
          TimePartitioning.newBuilder(TimePartitioning.Type.DAY)
              .setField("date")
              .setExpirationMs(Duration.of(90, ChronoUnit.DAYS).toMillis())
              .build();

      LoadJobConfiguration loadJobConfig =
          LoadJobConfiguration.builder(tableId, sourceUri)
              .setFormatOptions(FormatOptions.csv())
              .setSchema(schema)
              .setTimePartitioning(partitioning)
              .build();

      // Create a job ID so that we can safely retry.
      JobId jobId = JobId.of(UUID.randomUUID().toString());
      Job loadJob = bigquery.create(JobInfo.newBuilder(loadJobConfig).setJobId(jobId).build());

      // Load data from a GCS parquet file into the table
      // Blocks until this load table job completes its execution, either failing or succeeding.
      Job completedJob = loadJob.waitFor();

      // Check for errors
      if (completedJob == null) {
        throw new Exception("Job not executed since it no longer exists.");
      } else if (completedJob.getStatus().getError() != null) {
        // You can also look at queryJob.getStatus().getExecutionErrors() for all
        // errors, not just the latest one.
        throw new Exception(
            "BigQuery was unable to load into the table due to an error: \n"
                + loadJob.getStatus().getError());
      }
      System.out.println("Data successfully loaded into time partitioned table during load job");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println(
          "Data not loaded into time partitioned table during load job \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 libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');

// Instantiate clients
const bigquery = new BigQuery();
const storage = new Storage();

/**
 * This sample loads the CSV file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.csv
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states-by-date.csv';

async function loadTablePartitioned() {
  // Load data into a table that uses column-based time partitioning.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';
  // const tableId = 'my_new_table';

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad
  const partitionConfig = {
    type: 'DAY',
    expirationMs: '7776000000', // 90 days
    field: 'date',
  };

  const metadata = {
    sourceFormat: 'CSV',
    skipLeadingRows: 1,
    schema: {
      fields: [
        {name: 'name', type: 'STRING'},
        {name: 'post_abbr', type: 'STRING'},
        {name: 'date', type: 'DATE'},
      ],
    },
    location: 'US',
    timePartitioning: partitionConfig,
  };

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .load(storage.bucket(bucketName).file(filename), metadata);

  // load() waits for the job to finish
  console.log(`Job ${job.id} completed.`);
}

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"

job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
        bigquery.SchemaField("date", "DATE"),
    ],
    skip_leading_rows=1,
    time_partitioning=bigquery.TimePartitioning(
        type_=bigquery.TimePartitioningType.DAY,
        field="date",  # Name of the column to use for partitioning.
        expiration_ms=7776000000,  # 90 days.
    ),
)
uri = "gs://cloud-samples-data/bigquery/us-states/us-states-by-date.csv"

load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Wait for the job to complete.

table = client.get_table(table_id)
print("Loaded {} rows to table {}".format(table.num_rows, table_id))

Añadir datos CSV a una tabla o sobrescribirla

Puedes cargar datos adicionales en una tabla desde archivos de origen o añadiendo resultados de consultas.

En la Google Cloud consola, usa la opción Preferencia de escritura para especificar qué acción se debe llevar a cabo cuando cargues datos de un archivo de origen o de un resultado de consulta.

Cuando cargas datos adicionales en una tabla, tienes las siguientes opciones:

Opción de consola Marca de la herramienta bq Propiedad de la API de BigQuery Descripción
Escribir si está vacía No compatible WRITE_EMPTY Escribe los datos solo si la tabla está vacía.
Añadir a tabla --noreplace o --replace=false. Si no se especifica --[no]replace, el valor predeterminado es "append". WRITE_APPEND Predeterminado: Añade los datos al final de la tabla.
Sobrescribir tabla --replace o --replace=true WRITE_TRUNCATE Borra todos los datos de una tabla antes de escribir los nuevos datos. Esta acción también elimina el esquema de la tabla, la seguridad a nivel de fila y cualquier clave de Cloud KMS.

Si cargas datos en una tabla, la tarea de carga puede añadir los datos o sobrescribir la tabla.

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 Google Cloud Storage en la lista Crear tabla a partir de. A continuación, siga estos pasos:
      1. Selecciona un archivo del segmento de Cloud Storage o introduce el URI de Cloud Storage. No puedes incluir varias URIs en la consola Google Cloud , pero sí caracteres comodín. El segmento de Cloud Storage debe estar en la misma ubicación que el conjunto de datos que contiene la tabla que quieres crear, añadir o sobrescribir. Seleccionar el archivo de origen para crear una tabla de BigQuery
      2. En Formato de archivo, selecciona CSV.
    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. Para habilitar la detección automática de un esquema, selecciona Detectar automáticamente. 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. Opcional: Especifica la configuración de partición y clúster. Para obtener más información, consulta los artículos sobre cómo crear tablas con particiones y cómo crear y usar tablas agrupadas en clústeres. No puedes convertir una tabla en una tabla particionada o agrupada añadiéndole datos o sobrescribiéndola. La consola de Google Cloud no admite añadir datos a tablas particionadas o agrupadas, ni sobrescribirlas, en una tarea de carga.
    5. Haz clic en Opciones avanzadas y haz lo siguiente:
      • En Preferencia de escritura, elija Añadir a la tabla o Sobrescribir tabla.
      • En Número de errores permitidos, acepta el valor predeterminado 0 o introduce el número máximo de filas que contengan errores que se pueden ignorar. Si el número de filas con errores supera este valor, el trabajo mostrará un mensaje invalid y fallará. Esta opción solo se aplica a los archivos CSV y JSON.
      • En Zona horaria, introduzca la zona horaria predeterminada que se aplicará al analizar los valores de marca de tiempo que no tengan una zona horaria específica. Consulta aquí más nombres de zonas horarias válidos. Si no se incluye este valor, las marcas de tiempo sin una zona horaria específica se analizan con la zona horaria predeterminada UTC. Vista previa.
      • En Formato de fecha, introduce los elementos de formato que definen cómo se formatean los valores DATE en los archivos de entrada. Este campo espera el formato de estilos SQL (por ejemplo, MM/DD/YYYY). Si este valor está presente, este formato es el único compatible con DATE. La detección automática de esquemas también decidirá el tipo de columna DATE en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo DATE se analiza con los formatos predeterminados. Vista previa.
      • En Formato de fecha y hora, introduce los elementos de formato que definen cómo se formatean los valores DATETIME en los archivos de entrada. Este campo espera el formato de estilos SQL (por ejemplo, MM/DD/YYYY HH24:MI:SS.FF3). Si se incluye este valor, este formato será el único compatible con DATETIME. La detección automática de esquemas también decidirá el tipo de columna DATETIME en función de este formato en lugar del formato actual. Si este valor no está presente, el campo DATETIME se analiza con los formatos predeterminados. Vista previa.
      • En Formato de hora, introduzca los elementos de formato que definen cómo se formatean los valores TIME en los archivos de entrada. Este campo espera el formato de estilos SQL (por ejemplo, HH24:MI:SS.FF3). Si se incluye este valor, será el único formato TIME compatible. La detección automática de esquemas también determinará el tipo de columna TIME en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo TIME se analiza con los formatos predeterminados. Vista previa.
      • En Formato de marca de tiempo, introduzca los elementos de formato que definen cómo se formatean los valores TIMESTAMP en los archivos de entrada. Este campo espera el formato de estilos SQL (por ejemplo, MM/DD/YYYY HH24:MI:SS.FF3). Si se incluye este valor, este formato será el único compatible con TIMESTAMP. La detección automática de esquemas también determinará el tipo de columna TIMESTAMP en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo TIMESTAMP se analiza con los formatos predeterminados. Vista previa.
      • Si quieres ignorar los valores de una fila que no estén presentes en el esquema de la tabla, selecciona Valores desconocidos.
      • En Delimitador de campos, elige el carácter que separa las celdas de tu archivo CSV: Coma, Tabulación, Barra vertical o Personalizado. Si elige Personalizado, introduzca el delimitador en el cuadro Delimitador de campo personalizado. El valor predeterminado es Coma.
      • En Coincidencia de columnas de origen, elija una de las siguientes estrategias para asociar las columnas cargadas al esquema (Vista previa).
        • Default: el comportamiento predeterminado se elige en función de cómo se proporcione el esquema. Si la detección automática está habilitada, el comportamiento predeterminado es hacer coincidir las columnas por nombre. De lo contrario, las columnas se emparejarán por posición de forma predeterminada. Esto se hace para mantener la retrocompatibilidad.
        • Position: hace coincidir las columnas por posición, suponiendo que las columnas están ordenadas de la misma forma que el esquema.
        • Name: se basa en el nombre. Para ello, lee la fila de encabezado como los nombres de las columnas y reordena las columnas para que coincidan con los nombres de los campos del esquema. Los nombres de las columnas se leen de la última fila omitida en función de Filas de encabezado que se van a omitir.
      • En Filas de encabezado que se deben omitir, introduce el número de filas de encabezado que se deben omitir en la parte superior del archivo CSV. El valor predeterminado es 0.
      • En Saltos de línea entrecomillados, marca Permitir saltos de línea entrecomillados para permitir secciones de datos entrecomilladas que contengan caracteres de salto de línea en un archivo CSV. El valor predeterminado es false.
      • En Filas escalonadas, marca Permitir filas escalonadas para aceptar filas en archivos CSV a las que les falten columnas opcionales finales. Los valores que faltan se tratan como nulos. Si no se marca, los registros a los que les faltan columnas finales se tratan como registros incorrectos y, si hay demasiados, se devuelve un error no válido en el resultado del trabajo. El valor predeterminado es false.
      • En Marcadores nulos, introduce una lista de cadenas personalizadas que representen un valor NULL en los datos CSV. Vista previa.
      • En Encriptado, haz clic en Clave gestionada por el cliente para usar una clave de Cloud Key Management Service. Si dejas el ajuste Google-managed key, BigQuery cifra los datos en reposo.
    6. Haz clic en Crear tabla.

SQL

Usa la LOAD DATA instrucción DDL. En el siguiente ejemplo se añade un archivo CSV a la tabla mytable:

  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:

    LOAD DATA INTO mydataset.mytable
    FROM FILES (
      format = 'CSV',
      uris = ['gs://bucket/path/file.csv']);

  3. 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 load, especifica CSV con la marca --source_format e incluye un URI de Cloud Storage. Puede incluir un solo URI, una lista de URIs separados por comas o un URI que contenga un comodín.

Proporciona el esquema de forma insertada, en un archivo de definición de esquema o usa la detección automática de esquemas. Si no especifica un esquema, --autodetect es false y la tabla de destino existe, se usará el esquema de la tabla de destino.

Especifica la marca --replace para sobrescribir la tabla. Usa la marca --noreplace para añadir datos a la tabla. Si no se especifica ninguna marca, el valor predeterminado es añadir datos.

Es posible modificar el esquema de la tabla cuando la añades o la sobrescribes. Para obtener más información sobre los cambios de esquema admitidos durante una operación de carga, consulta Modificar esquemas de tabla.

(Opcional) Proporcione la marca --location y asigne el valor a su ubicación.

Otras marcas opcionales son:

  • --allow_jagged_rows: cuando se especifica, acepta las filas de los archivos CSV a las que les faltan columnas opcionales finales. Los valores que faltan se tratan como nulos. Si no se marca, los registros a los que les faltan columnas finales se tratan como registros incorrectos y, si hay demasiados registros incorrectos, se devuelve un error no válido en el resultado del trabajo. El valor predeterminado es false.
  • --allow_quoted_newlines: cuando se especifica, permite secciones de datos entre comillas que contienen caracteres de salto de línea en un archivo CSV. El valor predeterminado es false.
  • --field_delimiter: carácter que indica el límite entre las columnas de los datos. Se pueden usar tanto \t como tab para delimitar las pestañas. El valor predeterminado es ,.
  • --null_marker: cadena personalizada opcional que representa un valor NULL en los datos CSV.
  • --null_markers: (Vista previa) Lista opcional separada por comas de cadenas personalizadas que representan valores NULL en datos CSV. Esta opción no se puede usar con la marca --null_marker.
  • --source_column_match: (Vista previa) Especifica la estrategia utilizada para asociar las columnas cargadas al esquema. Puedes especificar POSITION para que coincidan las columnas cargadas por posición, siempre que las columnas estén ordenadas de la misma forma que el esquema. También puede especificar NAME para que se haga la coincidencia por nombre leyendo la fila de encabezado como los nombres de las columnas y reordenando las columnas para que coincidan con los nombres de los campos del esquema. Si no se especifica ningún valor, el valor predeterminado se basa en cómo se proporciona el esquema. Si --autodetect está habilitada, el comportamiento predeterminado es hacer coincidir las columnas por nombre. De lo contrario, las columnas se emparejarán por posición de forma predeterminada.
  • --skip_leading_rows: especifica el número de filas de encabezado que se deben omitir en la parte superior del archivo CSV. El valor predeterminado es 0.
  • --quote: carácter de comillas que se usa para delimitar los registros. El valor predeterminado es ". Para indicar que no hay ningún carácter de comillas, usa una cadena vacía.
  • --max_bad_records: número entero que especifica el número máximo de registros incorrectos que se permiten antes de que falle todo el trabajo. El valor predeterminado es 0. Se devuelven como máximo cinco errores de cualquier tipo, independientemente del valor de --max_bad_records.
  • --ignore_unknown_values: cuando se especifica, permite e ignora los valores adicionales no reconocidos en los datos CSV o JSON.
  • --time_zone: (Vista previa) Una zona horaria predeterminada opcional que se aplicará al analizar los valores de marca de tiempo que no tengan una zona horaria específica en los datos CSV o JSON.
  • --date_format: (Vista previa) Cadena personalizada opcional que define cómo se formatean los valores DATE en los datos CSV o JSON.
  • --datetime_format: (Vista previa) Cadena personalizada opcional que define cómo se formatean los valores DATETIME en los datos CSV o JSON.
  • --time_format: (Vista previa) Cadena personalizada opcional que define cómo se formatean los valores de TIME en los datos CSV o JSON.
  • --timestamp_format: (Vista previa) Cadena personalizada opcional que define el formato de los valores TIMESTAMP en los datos CSV o JSON.
  • --autodetect: Cuando se especifica, habilita la detección automática de esquemas para datos CSV y JSON.
  • --destination_kms_key: la clave de Cloud KMS para cifrar los datos de la tabla.
bq --location=location load \
--[no]replace \
--source_format=format \
dataset.table \
path_to_source \
schema

donde:

  • location es tu ubicación. La marca --location es opcional. Puedes definir un valor predeterminado para la ubicación mediante el archivo.bigqueryrc.
  • format es CSV.
  • dataset es un conjunto de datos.
  • table es el nombre de la tabla en la que se cargan los datos.
  • path_to_source es un URI de Cloud Storage completo o una lista de URIs separados por comas. También se admiten comodines.
  • schema es un esquema válido. El esquema puede ser un archivo JSON local o se puede escribir directamente como parte del comando. También puedes usar la marca --autodetect en lugar de proporcionar una definición de esquema.

Ejemplos:

El siguiente comando carga datos de gs://mybucket/mydata.csv y sobrescribe una tabla llamada mytable en mydataset. El esquema se define mediante la detección automática de esquemas.

    bq load \
    --autodetect \
    --replace \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv

El siguiente comando carga datos de gs://mybucket/mydata.csv y añade datos a una tabla llamada mytable en mydataset. El esquema se define mediante un archivo de esquema JSON: myschema.json.

    bq load \
    --noreplace \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

API

  1. Crea una tarea load que apunte a los datos de origen en Cloud Storage.

  2. (Opcional) Especifica tu ubicación en la propiedad location de la sección jobReference del recurso de empleo.

  3. La propiedad source URIs debe estar completa y tener el formato gs://bucket/object. Puedes incluir varios URIs en una lista separada por comas. Ten en cuenta que también se admiten comodines.

  4. Especifica el formato de los datos asignando el valor CSV a la propiedad configuration.load.sourceFormat.

  5. Especifica la preferencia de escritura asignando el valor WRITE_TRUNCATE o WRITE_APPEND a la propiedad configuration.load.writeDisposition.

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"

	"cloud.google.com/go/bigquery"
)

// importCSVTruncate demonstrates loading data from CSV data in Cloud Storage and overwriting/truncating
// data in the existing table.
func importCSVTruncate(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.csv")
	gcsRef.SourceFormat = bigquery.CSV
	gcsRef.AutoDetect = true
	gcsRef.SkipLeadingRows = 1
	loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
	loader.WriteDisposition = bigquery.WriteTruncate

	job, err := loader.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}

	if status.Err() != nil {
		return fmt.Errorf("job completed with error: %v", status.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.FormatOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.JobInfo.WriteDisposition;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.TableId;

// Sample to overwrite the BigQuery table data by loading a CSV file from GCS
public class LoadCsvFromGcsTruncate {

  public static void runLoadCsvFromGcsTruncate() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv";
    loadCsvFromGcsTruncate(datasetName, tableName, sourceUri);
  }

  public static void loadCsvFromGcsTruncate(String datasetName, String tableName, String sourceUri)
      throws Exception {
    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);

      LoadJobConfiguration configuration =
          LoadJobConfiguration.builder(tableId, sourceUri)
              .setFormatOptions(FormatOptions.csv())
              // Set the write disposition to overwrite existing table data
              .setWriteDisposition(WriteDisposition.WRITE_TRUNCATE)
              .build();

      // For more information on Job see:
      // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
      // Load the table
      Job loadJob = bigquery.create(JobInfo.of(configuration));

      // Load data from a GCS parquet file into the table
      // Blocks until this load table job completes its execution, either failing or succeeding.
      Job completedJob = loadJob.waitFor();

      // Check for errors
      if (completedJob == null) {
        throw new Exception("Job not executed since it no longer exists.");
      } else if (completedJob.getStatus().getError() != null) {
        // You can also look at queryJob.getStatus().getExecutionErrors() for all
        // errors, not just the latest one.
        throw new Exception(
            "BigQuery was unable to load into the table due to an error: \n"
                + loadJob.getStatus().getError());
      }
      System.out.println("Table is successfully overwritten by CSV file loaded from GCS");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Column not added during load append \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.

Para sustituir las filas de una tabla, asigna el valor 'WRITE_TRUNCATE' al parámetro writeDisposition en metadata.

// Import the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');

// Instantiate clients
const bigquery = new BigQuery();
const storage = new Storage();

/**
 * This sample loads the CSV file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.csv
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.csv';

async function loadCSVFromGCSTruncate() {
  /**
   * Imports a GCS file into a table and overwrites
   * table data if table already exists.
   */

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad
  const metadata = {
    sourceFormat: 'CSV',
    skipLeadingRows: 1,
    schema: {
      fields: [
        {name: 'name', type: 'STRING'},
        {name: 'post_abbr', type: 'STRING'},
      ],
    },
    // Set the write disposition to overwrite existing table data.
    writeDisposition: 'WRITE_TRUNCATE',
    location: 'US',
  };

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .load(storage.bucket(bucketName).file(filename), metadata);
  // load() waits for the job to finish
  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

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

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableId = 'The BigQuery table ID';

// instantiate the bigquery table service
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$table = $bigQuery->dataset($datasetId)->table($tableId);

// create the import job
$gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.csv';
$loadConfig = $table->loadFromStorage($gcsUri)->skipLeadingRows(1)->writeDisposition('WRITE_TRUNCATE');
$job = $table->runJob($loadConfig);

// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});

// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Data imported successfully' . PHP_EOL);
}

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.

Para sustituir las filas de una tabla, defina la propiedad LoadJobConfig.write_disposition en la constante SourceFormat WRITE_TRUNCATE.

import six

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

job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
    ],
)

body = six.BytesIO(b"Washington,WA")
client.load_table_from_file(body, table_id, job_config=job_config).result()
previous_rows = client.get_table(table_id).num_rows
assert previous_rows > 0

job_config = bigquery.LoadJobConfig(
    write_disposition=bigquery.WriteDisposition.WRITE_TRUNCATE,
    source_format=bigquery.SourceFormat.CSV,
    skip_leading_rows=1,
)

uri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv"
load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Waits for the job to complete.

destination_table = client.get_table(table_id)
print("Loaded {} rows.".format(destination_table.num_rows))

Cargar datos de CSV con particiones de Hive

BigQuery admite la carga de datos CSV con particiones de Hive almacenados en Cloud Storage y rellenará las columnas de partición de Hive como columnas en la tabla gestionada de BigQuery de destino. Para obtener más información, consulta el artículo Cargar datos con particiones externas desde Cloud Storage.

Detalles sobre la carga de datos de CSV

En esta sección se describe cómo gestiona BigQuery las distintas opciones de formato CSV.

Codificación

BigQuery espera que los datos CSV estén codificados en UTF-8. Si tiene archivos CSV con otros tipos de codificación admitidos, debe especificar la codificación de forma explícita para que BigQuery pueda convertir los datos a UTF-8 correctamente.

BigQuery admite los siguientes tipos de codificación para archivos CSV:

  • UTF-8
  • ISO-8859-1
  • UTF-16BE (UTF-16 Big Endian)
  • UTF-16LE (UTF-16 Little Endian)
  • UTF-32BE (UTF-32 Big Endian)
  • UTF-32LE (UTF-32 Little Endian)

Si no especificas ninguna codificación o si especificas la codificación UTF-8 cuando el archivo CSV no está codificado en UTF-8, BigQuery intentará convertir los datos a UTF-8. Por lo general, si el archivo CSV tiene la codificación ISO-8859-1, los datos se cargarán correctamente, pero es posible que no coincidan exactamente con lo que espera. Si el archivo CSV está codificado en UTF-16BE, UTF-16LE, UTF-32BE o UTF-32LE, es posible que no se pueda cargar. Para evitar errores inesperados, especifique la codificación correcta con la marca --encoding.

Si BigQuery no puede convertir un carácter que no sea el carácter ASCII 0, lo convierte en el carácter de sustitución Unicode estándar: �.

Delimitadores de campos

Los delimitadores de los archivos CSV pueden ser cualquier carácter de un solo byte. Si el archivo de origen usa la codificación ISO-8859-1, cualquier carácter puede ser un delimitador. Si el archivo de origen usa la codificación UTF-8, se puede usar cualquier carácter del intervalo decimal 1-127 (U+0001-U+007F) sin modificaciones. Puedes insertar un carácter ISO-8859-1 fuera de este intervalo como delimitador y BigQuery lo interpretará correctamente. Sin embargo, si usa un carácter multibyte como delimitador, algunos de los bytes se interpretarán incorrectamente como parte del valor del campo.

Por lo general, se recomienda usar un delimitador estándar, como una tabulación, una barra vertical o una coma. El valor predeterminado es una coma.

Tipos de datos

Booleano. BigQuery puede analizar cualquiera de los siguientes pares de datos booleanos: 1 o 0, true o false, t o f, yes o no, o y o n (sin distinción entre mayúsculas y minúsculas). La detección automática de esquemas detecta automáticamente cualquiera de estos valores, excepto 0 y 1.

Bytes. Las columnas con tipos BYTES deben codificarse como Base64.

Fecha Las columnas de tipo DATE deben tener el formato YYYY-MM-DD.

Fecha y hora. Las columnas de tipo FECHAHORA deben tener el formato YYYY-MM-DD HH:MM:SS[.SSSSSS].

Área geográfica. Las columnas de tipo GEOGRAPHY deben contener cadenas en uno de los siguientes formatos:

  • Texto conocido (WKT)
  • Binario conocido (WKB)
  • GeoJSON

Si usa WKB, el valor debe estar codificado en hexadecimal.

En la siguiente lista se muestran ejemplos de datos válidos:

  • WKT: POINT(1 2)
  • GeoJSON: { "type": "Point", "coordinates": [1, 2] }
  • WKB codificado en hexadecimal: 0101000000feffffffffffef3f0000000000000040

Antes de cargar datos GEOGRAPHY, consulta también el artículo sobre cómo cargar datos geoespaciales.

Intervalo. Las columnas con tipos INTERVAL deben tener el formato Y-M D H:M:S[.F], donde:

  • Y = Año. El intervalo admitido es de 0 a 10.000.
  • M = Mes. El intervalo admitido es de 1 a 12.
  • D = Día. El intervalo admitido es del 1 al último día del mes indicado.
  • H = Hora.
  • M = minuto.
  • S = Segundo.
  • [.F] = Fracciones de segundo de hasta seis dígitos, con una precisión de microsegundos.

Para indicar un valor negativo, añade un guion (-) delante.

En la siguiente lista se muestran ejemplos de datos válidos:

  • 10-6 0 0:0:0
  • 0-0 -5 0:0:0
  • 0-0 0 0:0:1.25

Para cargar datos de INTERVAL, debes usar el comando bq load y la marca --schema para especificar un esquema. No puedes subir datos de INTERVALO mediante la consola.

JSON. Las comillas se escapan mediante la secuencia de dos caracteres "". Para obtener más información, consulta un ejemplo de carga de datos JSON desde un archivo CSV.

Hora. Las columnas de tipo TIME deben tener el formato HH:MM:SS[.SSSSSS].

Timestamp. BigQuery acepta varios formatos de marca de tiempo. La marca de tiempo debe incluir una parte de fecha y una parte de hora.

  • La parte de la fecha puede tener el formato YYYY-MM-DD o YYYY/MM/DD.

  • La parte de la marca de tiempo debe tener el formato HH:MM[:SS[.SSSSSS]] (los segundos y las fracciones de segundo son opcionales).

  • La fecha y la hora deben estar separadas por un espacio o una "T".

  • Opcionalmente, después de la fecha y la hora se puede incluir una diferencia horaria respecto a UTC o el designador de zona UTC (Z). Para obtener más información, consulte Zonas horarias.

Por ejemplo, cualquiera de los siguientes valores de marca de tiempo son válidos:

  • 2018-08-19 12:11
  • 2018-08-19 12:11:35
  • 2018-08-19 12:11:35.22
  • 2018/08/19 12:11
  • 2018-07-05 12:54:00 UTC
  • 2018-08-19 07:11:35.220 -05:00
  • 2018-08-19T12:11:35.220Z

Si proporcionas un esquema, BigQuery también acepta la hora de la época de Unix para los valores de marca de tiempo. Sin embargo, la detección automática de esquemas no detecta este caso y trata el valor como un tipo numérico o de cadena.

Ejemplos de valores de marca de tiempo de época de Unix:

  • 1534680695
  • 1,534680695e12

RANGE Representado en archivos CSV con el formato [LOWER_BOUND, UPPER_BOUND), donde LOWER_BOUND y UPPER_BOUND son cadenas DATE, DATETIME o TIMESTAMP válidas. NULL y UNBOUNDED representan valores de inicio o de finalización ilimitados.

A continuación, se muestran ejemplos de valores CSV de RANGE<DATE>:

  • "[2020-01-01, 2021-01-01)"
  • "[UNBOUNDED, 2021-01-01)"
  • "[2020-03-01, NULL)"
  • "[UNBOUNDED, UNBOUNDED)"

Detección automática de esquemas

En esta sección se describe el comportamiento de la detección automática de esquemas al cargar archivos CSV.

Delimitador de CSV

BigQuery detecta los siguientes delimitadores:

  • coma ( , )
  • barra vertical ( | )
  • tabulador ( \t)

Encabezado del CSV

BigQuery infiere los encabezados comparando la primera fila del archivo con otras filas del mismo archivo. Si la primera línea solo contiene cadenas y las demás líneas contienen otros tipos de datos, BigQuery asume que la primera fila es una fila de encabezado. BigQuery asigna nombres de columna en función de los nombres de campo de la fila de encabezado. Es posible que los nombres se modifiquen para cumplir las reglas de nomenclatura de las columnas de BigQuery. Por ejemplo, los espacios se sustituirán por guiones bajos.

De lo contrario, BigQuery asumirá que la primera fila es una fila de datos y asignará nombres de columna genéricos, como string_field_1. Ten en cuenta que, una vez creada una tabla, los nombres de las columnas no se pueden actualizar en el esquema, aunque puedes cambiar los nombres manualmente después de crear la tabla. Otra opción es proporcionar un esquema explícito en lugar de usar la detección automática.

Puede que tengas un archivo CSV con una fila de encabezado en la que todos los campos de datos sean cadenas. En ese caso, BigQuery no detectará automáticamente que la primera fila es un encabezado. Usa la opción --skip_leading_rows para omitir la fila de encabezado. De lo contrario, el encabezado se importará como datos. También puedes proporcionar un esquema explícito en este caso para asignar nombres de columna.

Saltos de línea entre comillas en archivos CSV

BigQuery detecta los caracteres de nueva línea entre comillas en un campo CSV y no los interpreta como límites de filas.

Solucionar errores de análisis

Si hay algún problema al analizar los archivos CSV, el recurso errors del trabajo de carga se rellena con los detalles del error.

Por lo general, estos errores identifican el inicio de la línea problemática con un desplazamiento de bytes. En el caso de los archivos sin comprimir, puedes usar gcloud storage con el argumento --recursive para acceder a la línea correspondiente.

Por ejemplo, ejecutas el comando bq load y recibes un error:

bq load
    --skip_leading_rows=1 \
    --source_format=CSV \
    mydataset.mytable \
    gs://my-bucket/mytable.csv \
    'Number:INTEGER,Name:STRING,TookOffice:STRING,LeftOffice:STRING,Party:STRING'

El error en la salida es similar al siguiente:

Waiting on bqjob_r5268069f5f49c9bf_0000018632e903d7_1 ... (0s)
Current status: DONE
BigQuery error in load operation: Error processing job
'myproject:bqjob_r5268069f5f49c9bf_0000018632e903d7_1': Error while reading
data, error message: Error detected while parsing row starting at position: 1405.
Error: Data between close quote character (") and field separator.
File: gs://my-bucket/mytable.csv
Failure details:
- gs://my-bucket/mytable.csv: Error while reading data,
error message: Error detected while parsing row starting at
position: 1405. Error: Data between close quote character (") and
field separator. File: gs://my-bucket/mytable.csv
- Error while reading data, error message: CSV processing encountered
too many errors, giving up. Rows: 22; errors: 1; max bad: 0; error
percent: 0

Según el error anterior, hay un error de formato en el archivo. Para ver el contenido del archivo, ejecuta el comando gcloud storage cat:

gcloud storage cat 1405-1505 gs://my-bucket/mytable.csv --recursive

El resultado debería ser similar al siguiente:

16,Abraham Lincoln,"March 4, 1861","April 15, "1865,Republican
18,Ulysses S. Grant,"March 4, 1869",
...

Según el resultado del archivo, el problema es que hay comillas mal colocadas en "April 15, "1865.

Archivos CSV comprimidos

Depurar errores de análisis es más difícil en el caso de los archivos CSV comprimidos, ya que el desplazamiento de bytes indicado hace referencia a la ubicación en el archivo sin comprimir. El siguiente gcloud storage cat comando transmite el archivo desde Cloud Storage, lo descomprime, identifica el desplazamiento de bytes adecuado e imprime la línea con el error de formato:

gcloud storage cat gs://my-bucket/mytable.csv.gz | gunzip - | tail -c +1406 | head -n 1

El resultado debería ser similar al siguiente:

16,Abraham Lincoln,"March 4, 1861","April 15, "1865,Republican

Opciones de CSV

Para cambiar la forma en que BigQuery analiza los datos CSV, especifica opciones adicionales en la Google Cloud consola, la herramienta de línea de comandos bq o la API.

Para obtener más información sobre el formato CSV, consulta el estándar RFC 4180.

Opción CSV Opción de consola Marca de la herramienta bq Propiedad de la API de BigQuery Descripción
Delimitador de campos Delimitador de campos: coma, tabulación, barra vertical o personalizado -F o --field_delimiter fieldDelimiter (Java, Python) (Opcional) El separador de los campos de un archivo CSV. El separador puede ser cualquier carácter de un solo byte ISO-8859-1. BigQuery convierte la cadena a la codificación ISO-8859-1 y usa el primer byte de la cadena codificada para dividir los datos en su estado binario sin procesar. BigQuery también admite la secuencia de escape "\t" para especificar un separador de tabulación. El valor predeterminado es una coma (`,`).
Filas de encabezado Filas de encabezado que se deben omitir --skip_leading_rows skipLeadingRows (Java, Python) (Opcional) Un número entero que indica el número de filas de encabezado de los datos de origen.
Coincidencia de la columna de origen Coincidencia de columnas de origen: Predeterminada, Posición o Nombre --source_column_match Ninguno Vista previa (opcional): controla la estrategia que se usa para asociar las columnas cargadas al esquema. Los valores admitidos son:
  • POSITION: coincidencias por posición. Esta opción da por hecho que las columnas están ordenadas de la misma forma que el esquema.
  • NAME: coincide por nombre. Esta opción lee la fila de encabezado como nombres de columna y reordena las columnas para que coincidan con los nombres de los campos del esquema. Los nombres de las columnas se leen de la última fila omitida en función de la propiedad skipLeadingRows.
Si no se especifica ningún valor, el valor predeterminado se basa en cómo se proporciona el esquema. Si la detección automática está habilitada, el comportamiento predeterminado es hacer coincidir las columnas por nombre. De lo contrario, las columnas se emparejarán por posición de forma predeterminada. Esto se hace para mantener la retrocompatibilidad.
Número de registros incorrectos permitidos Número de errores permitidos --max_bad_records maxBadRecords (Java, Python) (Opcional) Número máximo de registros incorrectos que BigQuery puede ignorar al ejecutar la tarea. Si el número de registros incorrectos supera este valor, se devuelve un error no válido en el resultado del trabajo. El valor predeterminado es 0, lo que requiere que todos los registros sean válidos.
Caracteres de salto de línea Permitir saltos de línea entrecomillados --allow_quoted_newlines allowQuotedNewlines (Java, Python) (Opcional) Indica si se permiten secciones de datos entre comillas que contengan caracteres de salto de línea en un archivo CSV. El valor predeterminado es false.
Valores nulos personalizados Ninguno --null_marker nullMarker (Java, Python) (Opcional) Especifica una cadena que representa un valor nulo en un archivo CSV. Por ejemplo, si especifica "\N", BigQuery interpreta "\N" como un valor nulo al cargar un archivo CSV. El valor predeterminado es la cadena vacía. Si asignas un valor personalizado a esta propiedad, BigQuery generará un error si hay una cadena vacía en todos los tipos de datos, excepto en STRING y BYTE. En el caso de las columnas STRING y BYTE, BigQuery interpreta la cadena vacía como un valor vacío.
Columnas opcionales finales Permitir filas escalonadas --allow_jagged_rows allowJaggedRows (Java, Python) (Opcional) Acepta las filas que no tengan columnas opcionales finales. Los valores que faltan se tratan como nulos. Si es falso, los registros a los que les faltan columnas finales se tratan como registros incorrectos y, si hay demasiados registros incorrectos, se devuelve un error no válido en el resultado del trabajo. El valor predeterminado es false. Solo se aplica a los archivos CSV. Se ignora en otros formatos.
Valores desconocidos Ignorar valores desconocidos --ignore_unknown_values ignoreUnknownValues (Java, Python) (Opcional) Indica si BigQuery debe permitir valores adicionales que no estén representados en el esquema de la tabla. Si es true, se ignoran los valores adicionales. Si es false, los registros con columnas adicionales se tratan como registros incorrectos y, si hay demasiados registros incorrectos, se devuelve un error no válido en el resultado del trabajo. El valor predeterminado es false. La propiedad sourceFormat determina qué considera BigQuery como un valor adicional:
  • CSV: columnas finales
  • JSON: valores con nombre que no coinciden con ningún nombre de columna
Presupuesto Carácter de comillas: comillas dobles, comillas simples, ninguno o personalizado --quote quote (Java, Python) (Opcional) Valor que se usa para entrecomillar secciones de datos en un archivo CSV. BigQuery convierte la cadena a la codificación ISO-8859-1 y, a continuación, usa el primer byte de la cadena codificada para dividir los datos en su estado binario sin procesar. El valor predeterminado es una comilla doble ("). Si sus datos no contienen secciones entre comillas, asigne a la propiedad el valor de una cadena vacía. Si sus datos contienen caracteres de salto de línea entre comillas, también debe asignar el valor true a la propiedad allowQuotedNewlines. Para incluir el carácter de comillas específico en un valor entre comillas, precede el carácter con otro carácter de comillas coincidente. Por ejemplo, si quiere escapar el carácter predeterminado ' " ', use ' "" '.
Codificación Ninguno -E o --encoding encoding (Java, Python) (Opcional) La codificación de caracteres de los datos. Los valores admitidos son UTF-8, ISO-8859-1, UTF-16BE, UTF-16LE, UTF-32BE o UTF-32LE. El valor predeterminado es UTF-8. BigQuery decodifica los datos después de que se hayan dividido los datos binarios sin procesar mediante los valores de las propiedades quote y fieldDelimiter.
Carácter de control ASCII Ninguno --preserve_ascii_control_characters Ninguno (Opcional) Si quieres permitir el carácter ASCII 0 y otros caracteres de control ASCII, asigna el valor --preserve_ascii_control_characters a true en tus trabajos de carga.
Marcadores nulos Marcadores nulos --null_markers Ninguno Vista previa (opcional) Lista de cadenas personalizadas que representa un valor NULL en datos CSV. Esta opción no se puede usar con la opción --null_marker.
Zona horaria Zona horaria --time_zone Ninguno Vista previa (opcional) Zona horaria predeterminada que se aplicará al analizar valores de marca de tiempo que no tengan una zona horaria específica. Consulta los nombres de zonas horarias válidos. Si no se incluye este valor, las marcas de tiempo sin una zona horaria específica se analizan con la zona horaria predeterminada UTC.
Formato de fecha Formato de fecha --date_format Ninguno Vista previa (opcional) Elementos de formato que definen cómo se formatean los valores DATE en los archivos de entrada (por ejemplo, MM/DD/YYYY). Si se incluye este valor, este formato es el único formato DATE compatible. La detección automática de esquemas también determinará el tipo de columna DATE en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo DATE se analiza con los formatos predeterminados.
Formato de fecha y hora Formato de fecha y hora --datetime_format Ninguno Vista previa (opcional) Elementos de formato que definen cómo se formatean los valores DATETIME en los archivos de entrada (por ejemplo, MM/DD/YYYY HH24:MI:SS.FF3). Si se incluye este valor, este formato es el único compatible con DATETIME. La detección automática de esquemas también determinará el tipo de columna DATETIME en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo DATETIME se analiza con los formatos predeterminados.
Formato de hora Formato de hora --time_format Ninguno Vista previa (opcional) Elementos de formato que definen cómo se formatean los valores de TIME en los archivos de entrada (por ejemplo, HH24:MI:SS.FF3). Si se incluye este valor, este formato será el único compatible con TIME. La detección automática de esquemas también decidirá el tipo de columna TIME en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo TIME se analiza con los formatos predeterminados.
Formato de marca de tiempo Formato de marca de tiempo --timestamp_format Ninguno Vista previa (opcional) Elementos de formato que definen cómo se formatean los valores de TIMESTAMP en los archivos de entrada (por ejemplo, MM/DD/YYYY HH24:MI:SS.FF3). Si se incluye este valor, este formato es el único compatible con TIMESTAMP. La detección automática de esquemas también determinará el tipo de columna TIMESTAMP en función de este formato en lugar del formato actual. Si no se incluye este valor, el campo TIMESTAMP se analiza con los formatos predeterminados.