Cargar datos de Blob Storage en BigQuery

Puede cargar datos de Blob Storage en BigQuery mediante el conector BigQuery Data Transfer Service para Blob Storage. Con BigQuery Data Transfer Service, puedes programar tareas de transferencia periódicas que añadan tus datos más recientes de Blob Storage a BigQuery.

Antes de empezar

Antes de crear una transferencia de datos de Blob Storage, haz lo siguiente:

Permisos obligatorios

Para crear una transferencia de datos de Blob Storage, necesitas el permiso de bigquery.transfers.update Gestión de Identidades y Accesos (IAM). También necesitas los permisos bigquery.datasets.get y bigquery.datasets.update en el conjunto de datos de destino.

El rol de gestión de identidades y accesos bigquery.admin predefinido incluye los permisos que necesita para crear una transferencia de datos de Blob Storage.

Para obtener más información sobre la gestión de identidades y accesos de BigQuery, consulta el artículo sobre el control de acceso con la gestión de identidades y accesos.

Para confirmar que tienes los permisos correctos en Blob Storage para habilitar la transferencia de datos, consulta Firma de acceso compartido (SAS).

Si quieres configurar notificaciones de ejecuciones de transferencias para Pub/Sub, debes tener el permiso pubsub.topics.setIamPolicy. Los permisos de Pub/Sub solo son necesarios para las notificaciones por correo electrónico. Para obtener más información, consulta el artículo sobre las notificaciones de ejecución de BigQuery Data Transfer Service.

Limitaciones

Las transferencias de datos de Blob Storage están sujetas a las siguientes limitaciones:

Configurar una transferencia de datos de Blob Storage

Selecciona una de las opciones siguientes:

Consola

  1. Ve a la página Transferencias de datos de la Google Cloud consola.

    Ir a Transferencias de datos

  2. Haz clic en Crear transferencia.

  3. En la página Crear transferencia, haz lo siguiente:

    • En la sección Tipo de fuente, en Fuente, selecciona Azure Blob Storage y ADLS:

      Tipo de fuente de transferencia

    • En la sección Nombre de la configuración de transferencia, en Nombre visible, indica un nombre para la transferencia de datos.

    • En la sección Opciones de programación:

      • Selecciona una Frecuencia de repetición. Si selecciona Horas, Días, Semanas o Meses, también debe especificar una frecuencia. También puedes seleccionar Personalizar para especificar una frecuencia de repetición personalizada. Si seleccionas Bajo demanda, la transferencia de datos se realizará cuando la inicies manualmente.
      • Si procede, selecciona Empezar ahora o Empezar a una hora determinada y proporciona una fecha de inicio y un tiempo de ejecución.
    • En la sección Configuración de destino, en Conjunto de datos, elija el conjunto de datos que haya creado para almacenar sus datos.

    • En la sección Detalles de la fuente de datos, haga lo siguiente:

      • En Tabla de destino, introduzca el nombre de la tabla que ha creado para almacenar los datos en BigQuery. Los nombres de las tablas de destino admiten parámetros.
      • En Nombre de cuenta de almacenamiento de Azure, introduce el nombre de la cuenta de Blob Storage.
      • En Container name (Nombre del contenedor), escribe el nombre del contenedor de Blob Storage.
      • En Ruta de datos, introduzca la ruta para filtrar los archivos que se van a transferir. Consulta ejemplos.
      • En Token de SAS, introduce el token de SAS de Azure.
      • En Formato de archivo, elija el formato de los datos de origen.
      • En Disposición de escritura, seleccione WRITE_APPEND para añadir datos nuevos de forma incremental a la tabla de destino o WRITE_TRUNCATE para sobrescribir los datos de la tabla de destino durante cada ejecución de la transferencia. WRITE_APPEND es el valor predeterminado de Escribir disposición.

      Para obtener más información sobre cómo ingiere datos BigQuery Data Transfer Service mediante WRITE_APPEND o WRITE_TRUNCATE, consulta Ingestión de datos para transferencias de Azure Blob. Para obtener más información sobre el campo writeDisposition, consulta JobConfigurationLoad.

      Detalles de la fuente de datos

    • En la sección Opciones de transferencia, haga lo siguiente:

      • En Número de errores permitidos, introduce un valor entero para el número máximo de registros incorrectos que se pueden ignorar. El valor predeterminado es 0.
      • (Opcional) En el caso de los tipos de destino decimales, introduzca una lista separada por comas de los posibles tipos de datos SQL a los que se convertirán los valores decimales de los datos de origen. El tipo de datos SQL que se selecciona para la conversión depende de las siguientes condiciones:
        • En el orden NUMERIC, BIGNUMERIC y STRING, se elige un tipo si está en la lista especificada y si admite la precisión y la escala.
        • Si ninguno de los tipos de datos de la lista admite la precisión y la escala, se seleccionará el tipo de datos que admita el intervalo más amplio de la lista especificada. Si un valor supera el intervalo admitido al leer los datos de origen, se produce un error.
        • El tipo de datos STRING admite todos los valores de precisión y escala.
        • Si este campo se deja vacío, el tipo de datos será NUMERIC,STRING de forma predeterminada para ORC y NUMERIC para otros formatos de archivo.
        • Este campo no puede contener tipos de datos duplicados.
        • Se ignora el orden de los tipos de datos que incluyas.
    • Si has elegido CSV o JSON como formato de archivo, en la sección JSON, CSV, marca la opción Ignorar valores desconocidos para aceptar las filas que contengan valores que no coincidan con el esquema.

    • Si has elegido CSV como formato de archivo, en la sección CSV, introduce las opciones adicionales de CSV que quieras para cargar los datos.

      Opciones de CSV

    • En la sección Opciones de notificación, puedes habilitar las notificaciones por correo electrónico y las notificaciones de Pub/Sub.

      • Si habilitas las notificaciones por correo, el administrador de la transferencia recibirá una notificación por correo cuando falle una ejecución de transferencia.
      • Cuando habilites las notificaciones de Pub/Sub, elige un nombre de tema para publicar o haz clic en Crear tema para crear uno.
    • Si usas CMEKs, en la sección Opciones avanzadas, selecciona Clave gestionada por el cliente. Aparecerá una lista de las CMEKs disponibles para que elijas la que quieras. Para obtener información sobre cómo funcionan las CMEKs con BigQuery Data Transfer Service, consulta Especificar una clave de cifrado en las transferencias.

  4. Haz clic en Guardar.

bq

Usa el bq mk --transfer_config comando para crear una transferencia de Blob Storage:

bq mk \
  --transfer_config \
  --project_id=PROJECT_ID \
  --data_source=DATA_SOURCE \
  --display_name=DISPLAY_NAME \
  --target_dataset=DATASET \
  --destination_kms_key=DESTINATION_KEY \
  --params=PARAMETERS

Haz los cambios siguientes:

  • PROJECT_ID: (opcional) ID del proyecto que contiene el conjunto de datos de destino. Si no se especifica, se usará el proyecto predeterminado.
  • DATA_SOURCE: azure_blob_storage.
  • DISPLAY_NAME: el nombre visible de la configuración de transferencia de datos. El nombre de la transferencia puede ser cualquier valor que te permita identificarla si necesitas modificarla más adelante.
  • DATASET: el conjunto de datos de destino de la configuración de transferencia de datos.
  • DESTINATION_KEY: (Opcional) el ID de recurso de la clave de Cloud KMS. Por ejemplo, projects/project_name/locations/us/keyRings/key_ring_name/cryptoKeys/key_name.
  • PARAMETERS: los parámetros de la configuración de transferencia de datos, que se indican en formato JSON. Por ejemplo, --params={"param1":"value1", "param2":"value2"}. Estos son los parámetros de una transferencia de datos de Blob Storage:
    • destination_table_name_template: obligatorio. El nombre de la tabla de destino.
    • storage_account: obligatorio. Nombre de la cuenta de Blob Storage.
    • container: obligatorio. Nombre del contenedor de Blob Storage.
    • data_path: opcional. Ruta para filtrar los archivos que se van a transferir. Consulta los ejemplos.
    • sas_token: obligatorio. Token SAS de Azure.
    • file_format: opcional. El tipo de archivos que quieres transferir: CSV, JSON, AVRO, PARQUET o ORC. El valor predeterminado es CSV.
    • write_disposition: opcional. Selecciona WRITE_APPEND para añadir datos a la tabla de destino o WRITE_TRUNCATE para sobrescribir los datos de la tabla de destino. El valor predeterminado es WRITE_APPEND.
    • max_bad_records: opcional. Número de registros incorrectos permitidos. El valor predeterminado es 0.
    • decimal_target_types: opcional. Lista separada por comas de los posibles tipos de datos SQL a los que se convierten los valores decimales de los datos de origen. Si no se proporciona este campo, el tipo de datos predeterminado es NUMERIC,STRING para ORC y NUMERIC para los demás formatos de archivo.
    • ignore_unknown_values: es opcional y se ignora si file_format no es JSON ni CSV. Asigna el valor true para aceptar filas que contengan valores que no coincidan con el esquema.
    • field_delimiter: opcional y solo se aplica cuando file_format es CSV. El carácter que separa los campos. El valor predeterminado es ,.
    • skip_leading_rows: opcional y solo se aplica cuando file_format es CSV. Indica el número de filas de encabezado que no quieres importar. El valor predeterminado es 0.
    • allow_quoted_newlines: es opcional y solo se aplica cuando file_format es CSV. Indica si se permiten saltos de línea en los campos entre comillas.
    • allow_jagged_rows: opcional y solo se aplica cuando file_format es CSV. Indica si se deben aceptar las filas a las que les faltan columnas opcionales finales. Los valores que faltan se rellenan con NULL.

Por ejemplo, el siguiente comando crea una transferencia de datos de Blob Storage llamada mytransfer:

bq mk \
  --transfer_config \
  --data_source=azure_blob_storage \
  --display_name=mytransfer \
  --target_dataset=mydataset \
  --destination_kms_key=projects/myproject/locations/us/keyRings/mykeyring/cryptoKeys/key1
  --params={"destination_table_name_template":"mytable",
      "storage_account":"myaccount",
      "container":"mycontainer",
      "data_path":"myfolder/*.csv",
      "sas_token":"my_sas_token_value",
      "file_format":"CSV",
      "max_bad_records":"1",
      "ignore_unknown_values":"true",
      "field_delimiter":"|",
      "skip_leading_rows":"1",
      "allow_quoted_newlines":"true",
      "allow_jagged_rows":"false"}

API

Usa el método projects.locations.transferConfigs.create y proporciona una instancia del recurso TransferConfig.

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.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.CreateTransferConfigRequest;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// Sample to create azure blob storage transfer config.
public class CreateAzureBlobStorageTransfer {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    final String displayName = "MY_TRANSFER_DISPLAY_NAME";
    final String datasetId = "MY_DATASET_ID";
    String tableId = "MY_TABLE_ID";
    String storageAccount = "MY_AZURE_STORAGE_ACCOUNT_NAME";
    String containerName = "MY_AZURE_CONTAINER_NAME";
    String dataPath = "MY_AZURE_FILE_NAME_OR_PREFIX";
    String sasToken = "MY_AZURE_SAS_TOKEN";
    String fileFormat = "CSV";
    String fieldDelimiter = ",";
    String skipLeadingRows = "1";
    Map<String, Value> params = new HashMap<>();
    params.put(
        "destination_table_name_template", Value.newBuilder().setStringValue(tableId).build());
    params.put("storage_account", Value.newBuilder().setStringValue(storageAccount).build());
    params.put("container", Value.newBuilder().setStringValue(containerName).build());
    params.put("data_path", Value.newBuilder().setStringValue(dataPath).build());
    params.put("sas_token", Value.newBuilder().setStringValue(sasToken).build());
    params.put("file_format", Value.newBuilder().setStringValue(fileFormat).build());
    params.put("field_delimiter", Value.newBuilder().setStringValue(fieldDelimiter).build());
    params.put("skip_leading_rows", Value.newBuilder().setStringValue(skipLeadingRows).build());
    createAzureBlobStorageTransfer(projectId, displayName, datasetId, params);
  }

  public static void createAzureBlobStorageTransfer(
      String projectId, String displayName, String datasetId, Map<String, Value> params)
      throws IOException {
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDisplayName(displayName)
            .setDataSourceId("azure_blob_storage")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (DataTransferServiceClient client = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      CreateTransferConfigRequest request =
          CreateTransferConfigRequest.newBuilder()
              .setParent(parent.toString())
              .setTransferConfig(transferConfig)
              .build();
      TransferConfig config = client.createTransferConfig(request);
      System.out.println("Azure Blob Storage transfer created successfully: " + config.getName());
    } catch (ApiException ex) {
      System.out.print("Azure Blob Storage transfer was not created." + ex.toString());
    }
  }
}

Especificar la clave de cifrado en las transferencias

Puedes especificar claves de cifrado gestionadas por el cliente (CMEKs) para cifrar los datos de una ejecución de transferencia. Puedes usar una CMEK para admitir transferencias desde Azure Blob Storage.

Cuando especifica una CMEK con una transferencia, BigQuery Data Transfer Service aplica la CMEK a cualquier caché intermedio en disco de los datos ingeridos para que todo el flujo de trabajo de transferencia de datos cumpla los requisitos de la CMEK.

No puedes actualizar una transferencia para añadir una CMEK si no se creó originalmente con una CMEK. Por ejemplo, no puedes cambiar una tabla de destino que originalmente estaba cifrada de forma predeterminada para que ahora se cifre con CMEK. Del mismo modo, tampoco puedes cambiar el tipo de cifrado de una tabla de destino cifrada con CMEK.

Puedes actualizar una CMEK de una transferencia si la configuración de la transferencia se creó originalmente con un cifrado CMEK. Cuando actualizas una CMEK de una configuración de transferencia, BigQuery Data Transfer Service propaga la CMEK a las tablas de destino en la siguiente ejecución de la transferencia, donde BigQuery Data Transfer Service sustituye las CMEKs obsoletas por la nueva CMEK durante la ejecución de la transferencia. Para obtener más información, consulta Actualizar una transferencia.

También puedes usar las claves predeterminadas del proyecto. Cuando especifica una clave predeterminada de proyecto con una transferencia, BigQuery Data Transfer Service usa la clave predeterminada de proyecto como clave predeterminada para cualquier configuración de transferencia nueva.

Solucionar problemas de configuración de transferencias

Si tienes problemas para configurar la transferencia de datos, consulta Problemas de transferencia de Blob Storage.

Siguientes pasos