Cargar datos de Amazon S3 en BigQuery

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

Antes de empezar

Antes de crear una transferencia de datos de Amazon S3, debes hacer lo siguiente:

Limitaciones

Las transferencias de datos de Amazon S3 están sujetas a las siguientes limitaciones:

  • La parte del URI de Amazon S3 correspondiente al segmento no se puede parametrizar.
  • Las transferencias de datos desde Amazon S3 con el parámetro Write disposition definido en WRITE_TRUNCATE transferirán todos los archivos coincidentes a Google Cloud durante cada ejecución. Esto puede generar costes adicionales de transferencia de datos salientes de Amazon S3. Para obtener más información sobre los archivos que se transfieren durante una ejecución, consulta Impacto de la coincidencia de prefijos frente a la coincidencia de comodines.
  • No se admiten las transferencias de datos desde regiones de AWS GovCloud (us-gov).
  • No se admiten transferencias de datos a ubicaciones de BigQuery Omni.
  • En función del formato de los datos de origen de Amazon S3, puede haber limitaciones adicionales. Para obtener más información, consulta estos artículos:

  • El intervalo mínimo entre transferencias de datos periódicas es de 1 hora. El intervalo predeterminado de una transferencia de datos periódica es de 24 horas.

Permisos obligatorios

Antes de crear una transferencia de datos de Amazon S3, haz lo siguiente:

  • Asegúrate de que la persona que crea la transferencia de datos tenga los siguientes permisos obligatorios en BigQuery:

    • Permisos de bigquery.transfers.update para crear la transferencia de datos
    • Permisos bigquery.datasets.get y bigquery.datasets.update en el conjunto de datos de destino

    El rol predefinido de gestión de identidades y accesos bigquery.admin incluye los permisos bigquery.transfers.update, bigquery.datasets.update y bigquery.datasets.get. Para obtener más información sobre los roles de gestión de identidades y accesos en BigQuery Data Transfer Service, consulta Control de acceso.

  • Consulta la documentación de Amazon S3 para asegurarte de que has configurado los permisos necesarios para habilitar la transferencia de datos. Como mínimo, los datos de origen de Amazon S3 deben tener aplicada la política gestionada por AWS AmazonS3ReadOnlyAccess.

Configurar una transferencia de datos de Amazon S3

Para crear una transferencia de datos de Amazon S3, sigue estos pasos:

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, elija Amazon S3.

      Fuente de transferencia

    • En la sección Nombre de la configuración de transferencia, en Nombre visible, indica un nombre para la transferencia; por ejemplo, My Transfer. El nombre de la transferencia puede ser cualquier valor que te permita identificar la transferencia si necesitas modificarla más adelante.

      Nombre de transferencia

    • 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 crear una frecuencia de repetición más específica. Si seleccionas Bajo demanda, la transferencia de datos solo 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 de destino, elija el conjunto de datos que haya creado para almacenar sus datos.

      Transferir conjunto de datos

    • En la sección Detalles de la fuente de datos:

      • 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 URI de Amazon S3, introduce el URI con el formato s3://mybucket/myfolder/.... Los URIs también admiten parámetros.
      • En ID de clave de acceso, introduzca su ID de clave de acceso.
      • En Clave de acceso secreta, introduce tu clave de acceso secreta.
      • En Formato de archivo, elige el formato de tus datos (JSON delimitado por líneas nuevas, CSV, Avro, Parquet u ORC).
      • En Disposición de escritura, elige una de las siguientes opciones:
        • WRITE_APPEND para añadir datos nuevos de forma incremental a la tabla de destino. WRITE_APPEND es el valor predeterminado de la preferencia de escritura.
        • WRITE_TRUNCATE para sobrescribir los datos de la tabla de destino durante cada ejecución de la transferencia de datos.

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

      Detalles de la fuente S3

    • En la sección Opciones de transferencia (todos los formatos):

      • En Número de errores permitidos, introduce un valor entero para el número máximo de registros incorrectos que se pueden ignorar.
      • (Opcional) En Tipos de destino decimales, introduzca una lista separada por comas de los posibles tipos de datos SQL a los que se podrían convertir los valores decimales de origen. El tipo de datos de SQL que se selecciona para la conversión depende de las siguientes condiciones:
        • El tipo de datos seleccionado para la conversión será el primero de la siguiente lista que admita la precisión y la escala de los datos de origen, en este orden: NUMERIC, BIGNUMERIC y STRING.
        • Si ninguno de los tipos de datos de la lista admite la precisión y la escala, se selecciona 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 producirá 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 los demás formatos de archivo.
        • Este campo no puede contener tipos de datos duplicados.
        • El orden de los tipos de datos que incluyas en este campo no importa.

      Opciones de transferencia de todos los formatos

    • 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. Los valores desconocidos se ignoran. En el caso de los archivos CSV, esta opción ignora los valores adicionales al final de una línea.

      Ignorar valores desconocidos

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

      Opciones de CSV

    • En el menú Cuenta de servicio, selecciona una cuenta de servicio de las asociadas a tu proyectoGoogle Cloud . Puedes asociar una cuenta de servicio a tu transferencia de datos en lugar de usar tus credenciales de usuario. Para obtener más información sobre el uso de cuentas de servicio con transferencias de datos, consulta el artículo Usar cuentas de servicio.

      • Si has iniciado sesión con una identidad federada, se necesita una cuenta de servicio para crear una transferencia de datos. Si has iniciado sesión con una cuenta de Google, no es obligatorio tener una cuenta de servicio para la transferencia de datos.
      • La cuenta de servicio debe tener los permisos necesarios.
    • (Opcional) En la sección Opciones de notificación:

      • Haz clic en el interruptor para habilitar las notificaciones por correo electrónico. Si habilitas esta opción, el administrador de las transferencias recibirá una notificación por correo cuando falle una ejecución de transferencia de datos.
      • En Seleccionar un tema de Pub/Sub, elige el nombre del tema o haz clic en Crear un tema para crear uno. Esta opción configura las notificaciones de Pub/Sub sobre la transferencia de datos.
  4. Haz clic en Guardar.

bq

Introduce el comando bq mk y proporciona la marca de creación de transferencia — --transfer_config.

bq mk \
--transfer_config \
--project_id=project_id \
--data_source=data_source \
--display_name=name \
--target_dataset=dataset \
--service_account_name=service_account \
--params='parameters'

Donde:

  • project_id: opcional. El ID de tu proyecto Google Cloud . Si no se proporciona --project_id para especificar un proyecto concreto, se usará el proyecto predeterminado.
  • data_source: obligatorio. La fuente de datos: amazon_s3.
  • display_name: obligatorio. Nombre visible de la configuración de la transferencia de datos. El nombre de la transferencia puede ser cualquier valor que te permita identificarla si necesitas modificarla más adelante.
  • dataset: obligatorio. El conjunto de datos de destino de la configuración de la transferencia de datos.
  • service_account: nombre de la cuenta de servicio que se usa para autenticar la transferencia de datos. La cuenta de servicio debe ser propiedad del mismo project_id que se usó para crear la transferencia de datos y debe tener todos los permisos necesarios.
  • parameters: obligatorio. Los parámetros de la configuración de transferencia creada en formato JSON. Por ejemplo: --params='{"param":"param_value"}'. Estos son los parámetros de una transferencia de Amazon S3:

    • destination_table_name_template: obligatorio. El nombre de la tabla de destino.
    • data_path: obligatorio. El URI de Amazon S3, con el siguiente formato:

      s3://mybucket/myfolder/...

      Los URIs también admiten parámetros.

    • access_key_id: obligatorio. Tu ID de clave de acceso.

    • secret_access_key: obligatorio. Tu clave de acceso secreta.

    • file_format: opcional. Indica el tipo de archivos que quieres transferir: CSV, JSON, AVRO, PARQUET o ORC. El valor predeterminado es CSV.

    • write_disposition: opcional. WRITE_APPEND solo transferirá los archivos que se hayan modificado desde la última ejecución correcta. WRITE_TRUNCATE transferirá todos los archivos coincidentes, incluidos los que se hayan transferido en una ejecución anterior. 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 podrían convertir los valores decimales 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. Indica si se deben ignorar los valores desconocidos de los datos.

    • field_delimiter: opcional y solo se aplica cuando file_format es CSV. El carácter que separa los campos. El valor predeterminado es una coma.

    • 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: opcional y solo se aplica cuando file_format es CSV. Indica si se permiten saltos de línea en campos entre comillas.

    • allow_jagged_rows: opcional y solo se aplica cuando file_format es CSV. Indica si se deben aceptar las filas que no tengan columnas opcionales finales. Los valores que falten se rellenarán con valores nulos.

Por ejemplo, el siguiente comando crea una transferencia de datos de Amazon S3 llamada My Transfer con un valor data_path de s3://mybucket/myfile/*.csv, un conjunto de datos de destino mydataset y file_format CSV. En este ejemplo se incluyen valores no predeterminados para los parámetros opcionales asociados al CSV file_format.

La transferencia de datos se crea en el proyecto predeterminado:

bq mk --transfer_config \
--target_dataset=mydataset \
--display_name='My Transfer' \
--params='{"data_path":"s3://mybucket/myfile/*.csv",
"destination_table_name_template":"MyTable",
"file_format":"CSV",
"write_disposition":"WRITE_APPEND",
"max_bad_records":"1",
"ignore_unknown_values":"true",
"field_delimiter":"|",
"skip_leading_rows":"1",
"allow_quoted_newlines":"true",
"allow_jagged_rows":"false"}' \
--data_source=amazon_s3

Después de ejecutar el comando, recibirás un mensaje como el siguiente:

[URL omitted] Please copy and paste the above URL into your web browser and follow the instructions to retrieve an authentication code.

Sigue las instrucciones y pega el código de autenticación en la línea de comandos.

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 amazon s3 transfer config.
public class CreateAmazonS3Transfer {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    String datasetId = "MY_DATASET_ID";
    String tableId = "MY_TABLE_ID";
    // Amazon S3 Bucket Uri with read role permission
    String sourceUri = "s3://your-bucket-name/*";
    String awsAccessKeyId = "MY_AWS_ACCESS_KEY_ID";
    String awsSecretAccessId = "AWS_SECRET_ACCESS_ID";
    String sourceFormat = "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("data_path", Value.newBuilder().setStringValue(sourceUri).build());
    params.put("access_key_id", Value.newBuilder().setStringValue(awsAccessKeyId).build());
    params.put("secret_access_key", Value.newBuilder().setStringValue(awsSecretAccessId).build());
    params.put("source_format", Value.newBuilder().setStringValue(sourceFormat).build());
    params.put("field_delimiter", Value.newBuilder().setStringValue(fieldDelimiter).build());
    params.put("skip_leading_rows", Value.newBuilder().setStringValue(skipLeadingRows).build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDisplayName("Your Aws S3 Config Name")
            .setDataSourceId("amazon_s3")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    createAmazonS3Transfer(projectId, transferConfig);
  }

  public static void createAmazonS3Transfer(String projectId, TransferConfig transferConfig)
      throws IOException {
    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("Amazon s3 transfer created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Amazon s3 transfer was not created." + ex.toString());
    }
  }
}

Impacto de la coincidencia de prefijos frente a la coincidencia con comodines

La API de Amazon S3 admite la coincidencia de prefijos, pero no la de comodines. Todos los archivos de Amazon S3 que coincidan con un prefijo se transferirán a Google Cloud. Sin embargo, solo se cargarán en BigQuery los que coincidan con el URI de Amazon S3 de la configuración de la transferencia. Esto podría provocar costes excesivos de transferencia de datos salientes de Amazon S3 en el caso de los archivos que se transfieren, pero no se cargan en BigQuery.

Por ejemplo, considere esta ruta de datos:

s3://bucket/folder/*/subfolder/*.csv

Junto con estos archivos en la ubicación de origen:

s3://bucket/folder/any/subfolder/file1.csv
s3://bucket/folder/file2.csv

De este modo, todos los archivos de Amazon S3 con el prefijo s3://bucket/folder/ se transferirán a Google Cloud. En este ejemplo, se transferirán tanto file1.csv como file2.csv.

Sin embargo, solo se cargarán en BigQuery los archivos que coincidan con s3://bucket/folder/*/subfolder/*.csv. En este ejemplo, solo se cargará file1.csv en BigQuery.

Solucionar problemas de configuración de transferencias

Si tienes problemas para configurar la transferencia de datos, consulta Problemas con la transferencia de Amazon S3.

Siguientes pasos