Cargar datos JSON desde Cloud Storage

Puedes cargar datos JSON delimitados por saltos de línea (ndJSON) de Cloud Storage en una tabla o partición nuevas, o bien añadirlos a una tabla o partición ya creadas o sobrescribirlas. Cuando los 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.

El formato ndJSON es el mismo que el formato JSON Lines.

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 JSON en BigQuery, ten en cuenta lo siguiente:

  • Los datos JSON deben estar delimitados por líneas nuevas (ndJSON). Cada objeto JSON debe estar en una línea independiente del archivo.
  • Si usa la compresión gzip, BigQuery no puede leer los datos en paralelo. Cargar datos JSON comprimidos en BigQuery es más lento que cargar datos 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.
  • BigQuery admite el tipo JSON aunque la información del esquema no se conozca en el momento de la ingestión. Un campo declarado como tipo JSON se carga con los valores JSON sin procesar.

  • Si usas la API de BigQuery para cargar un número entero fuera del intervalo [-253+1, 253-1] (normalmente, esto significa que es mayor que 9.007.199.254.740.991) en una columna de números enteros (INT64), pásalo como una cadena para evitar que los datos se dañen. Este problema se debe a una limitación en el tamaño de los números enteros en JSON o ECMAScript. Para obtener más información, consulta la sección Números de RFC 7159.

  • 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 archivo JSON 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 JSON

Puedes usar la utilidad gzip para comprimir archivos JSON. 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 JSON 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 JSON en una tabla nueva

Para cargar datos JSON de Cloud Storage en una tabla de BigQuery, sigue estos pasos:

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 JSONL (JSON delimitado por líneas nuevas).
    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 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 JSON 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 = 'JSON',
      uris = ['gs://bucket/path/file.json']);

  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 NEWLINE_DELIMITED_JSON 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.

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

Otras marcas opcionales son:

  • --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 Requerir un filtro de partición en las consultas.
  • --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.

    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 JSON en BigQuery, introduce el siguiente comando:

bq --location=LOCATION load \
--source_format=FORMAT \
DATASET.TABLE \
PATH_TO_SOURCE \
SCHEMA

Haz los cambios siguientes:

  • LOCATION: tu ubicación. La marca --location es opcional. Por ejemplo, si usas BigQuery en la región de Tokio, puedes asignar el valor asia-northeast1 a la marca. Puedes definir un valor predeterminado para la ubicación mediante el archivo.bigqueryrc.
  • FORMAT: NEWLINE_DELIMITED_JSON.
  • DATASET: un conjunto de datos.
  • TABLE: el nombre de la tabla en la que vas a cargar los datos.
  • PATH_TO_SOURCE: un URI de Cloud Storage completo o una lista de URIs separados por comas. También se admiten comodines.
  • SCHEMA: un esquema válido. El esquema puede ser un archivo JSON local o se puede escribir directamente como parte del comando. Si usas un archivo de esquema, no le asignes ninguna extensión. 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.json en una tabla llamada mytable en mydataset. El esquema se define en un archivo de esquema local llamado myschema.

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

El siguiente comando carga datos de gs://mybucket/mydata.json 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.

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

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

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

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

    bq load \
    --autodetect \
    --source_format=NEWLINE_DELIMITED_JSON \
    mydataset.mytable \
    gs://mybucket/mydata.json

El siguiente comando carga datos de gs://mybucket/mydata.json 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=NEWLINE_DELIMITED_JSON \
    mydataset.mytable \
    gs://mybucket/mydata.json \
    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=NEWLINE_DELIMITED_JSON \
    mydataset.mytable \
    gs://mybucket/mydata*.json

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.

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

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. Especifique el formato de datos JSON asignando el valor NEWLINE_DELIMITED_JSON a la propiedad sourceFormat.

  5. Para comprobar el estado del trabajo, llama a jobs.get(JOB_ID*), sustituyendo JOB_ID por 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 incluye 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 es posible que se hayan producido algunos errores no críticos, 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.

Usa el método BigQueryClient.CreateLoadJob() para iniciar un trabajo de carga desde Cloud Storage. Para usar JSONL, crea un objeto CreateLoadJobOptions y asigna el valor FileFormat.NewlineDelimitedJson a su propiedad SourceFormat.


using Google.Apis.Bigquery.v2.Data;
using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryLoadTableGcsJson
{
    public void LoadTableGcsJson(
        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.json";
        var dataset = client.GetDataset(datasetId);
        var schema = new TableSchemaBuilder {
            { "name", BigQueryDbType.String },
            { "post_abbr", BigQueryDbType.String }
        }.Build();
        TableReference destinationTableRef = dataset.GetTableReference(
            tableId: "us_states");
        // Create job configuration
        var jobOptions = new CreateLoadJobOptions()
        {
            SourceFormat = FileFormat.NewlineDelimitedJson
        };
        // Create and run job
        BigQueryJob 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"
)

// importJSONExplicitSchema demonstrates loading newline-delimited JSON data from Cloud Storage
// into a BigQuery table and providing an explicit schema for the data.
func importJSONExplicitSchema(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.json")
	gcsRef.SourceFormat = bigquery.JSON
	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.

Usa el método LoadJobConfiguration.builder(tableId, sourceUri) para iniciar una tarea de carga desde Cloud Storage. Para usar JSON delimitado por líneas nuevas, usa LoadJobConfiguration.setFormatOptions(FormatOptions.json()).

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.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 JSON data from Cloud Storage into a new BigQuery table
public class LoadJsonFromGCS {

  public static void runLoadJsonFromGCS() {
    // 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.json";
    Schema schema =
        Schema.of(
            Field.of("name", StandardSQLTypeName.STRING),
            Field.of("post_abbr", StandardSQLTypeName.STRING));
    loadJsonFromGCS(datasetName, tableName, sourceUri, schema);
  }

  public static void loadJsonFromGCS(
      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();

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

      // Load data from a GCS JSON 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("Json from GCS successfully loaded in a table");
      } 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 json file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.json
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.json';

async function loadJSONFromGCS() {
  // 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: 'NEWLINE_DELIMITED_JSON',
    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.json';
$schema = [
    'fields' => [
        ['name' => 'name', 'type' => 'string'],
        ['name' => 'post_abbr', 'type' => 'string']
    ]
];
$loadConfig = $table->loadFromStorage($gcsUri)->schema($schema)->sourceFormat('NEWLINE_DELIMITED_JSON');
$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 iniciar un trabajo de carga desde Cloud Storage. Para usar JSONL, define la propiedad LoadJobConfig.source_format como la cadena NEWLINE_DELIMITED_JSON y pasa la configuración de la tarea como argumento job_config al método load_table_from_uri().
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"),
    ],
    source_format=bigquery.SourceFormat.NEWLINE_DELIMITED_JSON,
)
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.json"

load_job = client.load_table_from_uri(
    uri,
    table_id,
    location="US",  # Must match the destination dataset location.
    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))

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.

Usa el método Dataset.load_job() para iniciar una tarea de carga desde Cloud Storage. Para usar JSONL, asigna el valor "json" al parámetro format.

require "google/cloud/bigquery"

def load_table_gcs_json 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.json"
  table_id = "us_states"

  load_job = dataset.load_job table_id, gcs_uri, format: "json" 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 anidados y repetidos en JSON

BigQuery admite la carga de datos anidados y repetidos de formatos de origen que admiten esquemas basados en objetos, como JSON, Avro, ORC, Parquet, Firestore y Datastore.

En cada línea debe aparecer un objeto JSON, incluidos los campos anidados o repetidos.

En el siguiente ejemplo se muestran datos anidados o repetidos. Esta tabla contiene información sobre personas. Consta de los siguientes campos:

  • id
  • first_name
  • last_name
  • dob (fecha de nacimiento)
  • addresses (un campo anidado y repetido)
    • addresses.status (actual o anterior)
    • addresses.address
    • addresses.city
    • addresses.state
    • addresses.zip
    • addresses.numberOfYears (años en la dirección)

El archivo de datos JSON tendría el siguiente aspecto. Observa que el campo de dirección contiene un array de valores (indicado por [ ]).

{"id":"1","first_name":"John","last_name":"Doe","dob":"1968-01-22","addresses":[{"status":"current","address":"123 First Avenue","city":"Seattle","state":"WA","zip":"11111","numberOfYears":"1"},{"status":"previous","address":"456 Main Street","city":"Portland","state":"OR","zip":"22222","numberOfYears":"5"}]}
{"id":"2","first_name":"Jane","last_name":"Doe","dob":"1980-10-16","addresses":[{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"},{"status":"previous","address":"321 Main Street","city":"Hoboken","state":"NJ","zip":"44444","numberOfYears":"3"}]}

El esquema de esta tabla sería el siguiente:

[
    {
        "name": "id",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "first_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "last_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "dob",
        "type": "DATE",
        "mode": "NULLABLE"
    },
    {
        "name": "addresses",
        "type": "RECORD",
        "mode": "REPEATED",
        "fields": [
            {
                "name": "status",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "address",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "city",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "state",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "zip",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "numberOfYears",
                "type": "STRING",
                "mode": "NULLABLE"
            }
        ]
    }
]

Para obtener información sobre cómo especificar un esquema anidado y repetido, consulta Especificar campos anidados y repetidos.

Cargar datos JSON semiestructurados

BigQuery permite cargar datos semiestructurados, en los que un campo puede tomar valores de diferentes tipos. En el siguiente ejemplo se muestran datos similares al ejemplo anterior de datos JSON anidados y repetidos, con la diferencia de que el campo address puede ser un STRING, un STRUCT o un ARRAY:

{"id":"1","first_name":"John","last_name":"Doe","dob":"1968-01-22","address":"123 First Avenue, Seattle WA 11111"}

{"id":"2","first_name":"Jane","last_name":"Doe","dob":"1980-10-16","address":{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"}}

{"id":"3","first_name":"Bob","last_name":"Doe","dob":"1982-01-10","address":[{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"}, "321 Main Street Hoboken NJ 44444"]}

Puede cargar estos datos en BigQuery con el siguiente esquema:

[
    {
        "name": "id",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "first_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "last_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "dob",
        "type": "DATE",
        "mode": "NULLABLE"
    },
    {
        "name": "address",
        "type": "JSON",
        "mode": "NULLABLE"
    }
]

El campo address se carga en una columna de tipo JSON que permite que contenga los tipos mixtos del ejemplo. Puede ingerir datos como JSON, tanto si contienen tipos mixtos como si no. Por ejemplo, puedes especificar JSON en lugar de STRING como tipo del campo first_name. Para obtener más información, consulta el artículo Trabajar con datos JSON en GoogleSQL.

Añadir datos JSON 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.

Puede añadir o sobrescribir una tabla de una de las siguientes formas:

  • La Google Cloud consola
  • Comando bq load de la herramienta de línea de comandos bq
  • El método de la API jobs.insert y la configuración de un trabajo load
  • Las bibliotecas de cliente

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 JSONL (JSON delimitado por líneas nuevas).
    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 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 JSON 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 = 'JSON',
      uris = ['gs://bucket/path/file.json']);

  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 NEWLINE_DELIMITED_JSON 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.

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:

  • --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

Haz los cambios siguientes:

  • LOCATION: tu ubicación. La marca --location es opcional. Puedes definir un valor predeterminado para la ubicación mediante el archivo.bigqueryrc.
  • FORMAT: NEWLINE_DELIMITED_JSON.
  • DATASET: un conjunto de datos.
  • TABLE: el nombre de la tabla en la que vas a cargar los datos.
  • PATH_TO_SOURCE: un URI de Cloud Storage completo o una lista de URIs separados por comas. También se admiten comodines.
  • SCHEMA: 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.json 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=NEWLINE_DELIMITED_JSON \
    mydataset.mytable \
    gs://mybucket/mydata.json

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

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

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. También se admiten comodines.

  4. Especifica el formato de los datos asignando el valor NEWLINE_DELIMITED_JSON 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"
)

// importJSONTruncate demonstrates loading data from newline-delimeted JSON data in Cloud Storage
// and overwriting/truncating data in the existing table.
func importJSONTruncate(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.json")
	gcsRef.SourceFormat = bigquery.JSON
	gcsRef.AutoDetect = true
	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

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.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 overwrite the BigQuery table data by loading a JSON file from GCS
public class LoadJsonFromGCSTruncate {

  public static void runLoadJsonFromGCSTruncate() {
    // 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.json";
    Schema schema =
        Schema.of(
            Field.of("name", StandardSQLTypeName.STRING),
            Field.of("post_abbr", StandardSQLTypeName.STRING));
    loadJsonFromGCSTruncate(datasetName, tableName, sourceUri, schema);
  }

  public static void loadJsonFromGCSTruncate(
      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();

      TableId tableId = TableId.of(datasetName, tableName);
      LoadJobConfiguration loadConfig =
          LoadJobConfiguration.newBuilder(tableId, sourceUri)
              .setFormatOptions(FormatOptions.json())
              // Set the write disposition to overwrite existing table data
              .setWriteDisposition(JobInfo.WriteDisposition.WRITE_TRUNCATE)
              .setSchema(schema)
              .build();

      // Load data from a GCS JSON 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("Table is successfully overwritten by JSON file loaded from GCS");
      } 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 JSON file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.json
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.json';

async function loadJSONFromGCSTruncate() {
  /**
   * 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: 'NEWLINE_DELIMITED_JSON',
    schema: {
      fields: [
        {name: 'name', type: 'STRING'},
        {name: 'post_abbr', type: 'STRING'},
      ],
    },
    // Set the write disposition to overwrite existing table data.
    writeDisposition: 'WRITE_TRUNCATE',
  };

  // 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';
// $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.json';
$loadConfig = $table->loadFromStorage($gcsUri)->sourceFormat('NEWLINE_DELIMITED_JSON')->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

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

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.

import io

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 = io.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.NEWLINE_DELIMITED_JSON,
)

uri = "gs://cloud-samples-data/bigquery/us-states/us-states.json"
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))

Ruby

Para sustituir las filas de una tabla, defina el parámetro write de Table.load_job() en "WRITE_TRUNCATE".

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_json_truncate dataset_id = "your_dataset_id",
                                 table_id   = "your_table_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  gcs_uri  = "gs://cloud-samples-data/bigquery/us-states/us-states.json"

  load_job = dataset.load_job table_id,
                              gcs_uri,
                              format: "json",
                              write:  "truncate"
  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 JSON con particiones de Hive

BigQuery permite cargar datos JSON particionados por Hive almacenados en Cloud Storage y rellena las columnas de partición de Hive como columnas en la tabla gestionada de BigQuery de destino. Para obtener más información, consulta Cargar datos con particiones externas.

Detalles sobre la carga de datos JSON

En esta sección se describe cómo analiza BigQuery varios tipos de datos al cargar datos JSON.

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 estar en formato ISO 8601 PYMDTHMS, donde:

  • P = Designador que indica que el valor representa una duración. Siempre debes incluirlo.
  • Y = Año
  • M = Mes
  • D = Día
  • T = Designador que indica la parte de la duración correspondiente a la hora. Siempre debes incluirlo.
  • H = Hora
  • M = Minuto
  • S = Segundo. Los segundos se pueden indicar como un valor entero o como un valor fraccionario 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:

  • P-10000Y0M-3660000DT-87840000H0M0S
  • P0Y0M0DT0H0M0.000001S
  • P10000Y0M3660000DT87840000H0M0S

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

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

Matriz (campo repetido). El valor debe ser una matriz JSON o null. JSON null se convierte en SQL NULL. La propia matriz no puede contener valores null.

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 JSON.

Campos anidados y repetidos de JSON

BigQuery infiere los campos anidados y repetidos de los archivos JSON. Si el valor de un campo es un objeto JSON, BigQuery carga la columna como un tipo RECORD. Si el valor de un campo es una matriz, BigQuery carga la columna como una columna repetida. Para ver un ejemplo de datos JSON con datos anidados y repetidos, consulta Cargar datos JSON anidados y repetidos.

Conversión de cadenas

Si habilitas la detección automática de esquemas, BigQuery convierte las cadenas en tipos booleanos, numéricos o de fecha y hora cuando sea posible. Por ejemplo, con los siguientes datos JSON, la detección automática del esquema convierte el campo id en una columna INTEGER:

{ "name":"Alice","id":"12"}
{ "name":"Bob","id":"34"}
{ "name":"Charles","id":"45"}

Tipos de codificación

BigQuery espera que los datos JSON estén codificados en UTF-8. Si tiene archivos JSON con otros tipos de codificación admitidos, debe especificar explícitamente la codificación mediante la marca --encoding para que BigQuery convierta los datos a UTF-8.

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

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

Opciones de JSON

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

Opción JSON Opción de consola Marca de la herramienta bq Propiedad de la API de BigQuery Descripción
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.
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.
Codificación Ninguno -E o --encoding encoding (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.
Zona horaria Zona horaria --time_zone Ninguno Vista previa (opcional) Zona horaria predeterminada que se aplica al analizar valores de marca de tiempo que no tienen 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.

Siguientes pasos