Transferencias de Cloud Storage

El Servicio de transferencia de datos de BigQuery para Cloud Storage te permite programar cargas de datos recurrentes de Cloud Storage a BigQuery.

Antes de comenzar

Antes de crear una transferencia de Cloud Storage, sigue estos pasos:

Limitaciones

Las transferencias recurrentes de Cloud Storage a BigQuery están sujetas a las siguientes limitaciones:

  • Todos los archivos que coincidan con los patrones que define un comodín o los parámetros del entorno de ejecución de tu transferencia deben compartir el mismo esquema que definiste para la tabla de destino, de lo contrario, la transferencia fallará. Los cambios en el esquema de tabla entre ejecuciones también hacen que la transferencia falle.
  • Debido a que se pueden crear versiones de los objetos de Cloud Storage, es importante que tengas en cuenta que las transferencias de BigQuery no admiten objetos archivados de Cloud Storage. Los objetos deben estar activos para que se puedan transferir.
  • A diferencia de las cargas individuales de datos de Cloud Storage a BigQuery, para las transferencias en curso, debes crear la tabla de destino y el esquema antes de configurar la transferencia. BigQuery no puede crear la tabla como parte del proceso de transferencia de datos recurrentes.
  • Las transferencias de Cloud Storage establecen el parámetro Preferencia de escritura en APPEND de forma predeterminada. En este modo, un archivo sin modificar solo se puede cargar en BigQuery una vez. Si se actualiza la propiedad last modification time del archivo, se volverá a cargar el archivo.
  • El Servicio de transferencia de datos de BigQuery no garantiza que todos los archivos se transfieran o transfieran solo una vez si se manipulan los archivos de Cloud Storage durante la transferencia.
  • Si la ubicación de tu conjunto de datos está configurada en un valor diferente a US, el depósito de Cloud Storage regional o multirregional debe estar en la misma región que el conjunto de datos.
  • BigQuery no garantiza la coherencia de los datos provenientes de fuentes de datos externas. Los cambios en los datos subyacentes mientras se ejecuta una consulta pueden dar como resultado un comportamiento inesperado.
  • BigQuery no es compatible con el control 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á.

  • Según el formato de tus datos de origen de Cloud Storage, puede haber limitaciones adicionales. Para obtener más información, consulta:

  • Tu depósito de Cloud Storage debe estar en una región o multirregión compatible con la región o multirregión del conjunto de datos de destino en BigQuery. Esto se conoce como colocación. Consulta las ubicaciones de datos de transferencia de Cloud Storage para obtener más información.

Intervalos mínimos

  • Los archivos fuente se recogen para transferirlos de inmediato, sin una antig ageedad mínima del archivo.
  • El tiempo de intervalo mínimo entre transferencias recurrentes es de 15 minutos. El intervalo predeterminado de una transferencia recurrente es cada 24 horas.

Permisos necesarios

Cuando cargas datos en BigQuery, necesitas permisos para cargar datos en tablas y particiones de BigQuery nuevas o existentes. Si cargas datos de Cloud Storage, también necesitarás acceso al bucket que contiene tus datos. Asegúrate de que tienes los siguientes permisos necesarios:

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

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

    La función de IAM predefinida bigquery.admin incluye los permisos bigquery.transfers.update, bigquery.datasets.update y bigquery.datasets.get. Para obtener más información sobre las funciones de IAM en el Servicio de transferencia de datos de BigQuery, consulta la página sobre la referencia de control de acceso.

  • Cloud Storage: Se requieren permisos storage.objects.get en el depósito individual o superior. Si usas un comodín de URI, también debes tener permisos storage.objects.list. Si deseas borrar los archivos de origen después de cada transferencia exitosa, también necesitas permisos storage.objects.delete. La función de IAM predefinida de storage.objectAdmin incluye todos estos permisos.

Configura una transferencia de Cloud Storage

Para crear una transferencia de Cloud Storage en el Servicio de transferencia de datos de BigQuery, sigue estos pasos:

Console

  1. Ve a la página de BigQuery en Cloud Console.

    Ir a la página de BigQuery

  2. Haz clic en Transfers.

  3. Haz clic en Crear.

  4. En la página Crear transferencia, sigue estos pasos:

    • En la sección Tipo de fuente (Source type), para Fuente (Source), elige Cloud Storage.

      Fuente de transferencia

    • En la sección Nombre de la configuración de transferencia (Transfer config name), en Nombre visible (Display name), ingresa el nombre de la transferencia, como My Transfer. El nombre de la transferencia puede ser cualquier valor que te permita identificarla con facilidad si es necesario hacerle modificaciones más tarde.

      Nombre de la transferencia

    • En laOpciones de programación sección, paraProgramación , deje el valor predeterminado (Comenzar ahora ) o haga clic enComenzar a una hora establecida ,

      • En Repeticiones (Repeats), selecciona una opción para la frecuencia con la que se ejecutará la transferencia. El intervalo mínimo es de 15 minutos.
        • Diariamente (predeterminada)
        • Semanal
        • Mensual
        • Personalizado. En Custom Schedule, ingresa una frecuencia personalizada. por ejemplo, every day 00:00. Consulta Da formato al programa.
        • A pedido
      • En Fecha de inicio y hora de ejecución (Start date and run time), ingresa la fecha y hora para iniciar la transferencia. Si seleccionas Comenzar ahora (Start now), esta opción se inhabilitará.

        Programa de la transferencia

    • En la sección Configuración de destino, en Conjunto de datos de destino, selecciona el conjunto de datos que creaste para almacenar tus datos.

      Conjunto de datos de la transferencia

    • En la sección Detalles de fuente de datos (Data source details):

      • En Tabla de destino, ingresa el nombre de tu tabla de destino. La tabla de destino debe seguir las reglas de nombres de las tablas. Los nombres de las tablas de destino también admiten parámetros.
      • En el URI de Cloud Storage (Cloud Storage URI), ingresa los URI de Cloud Storage. Se admiten comodines y parámetros.
      • En Preferencia de escritura (Write preference), elige una de las siguientes opciones:

        • ADJUNTA para agregar datos nuevos a tu tabla de destino existente. Los trabajos de carga de BigQuery se activan con la preferencia WRITE_APPEND. Para obtener más información, consulta los detalles del campo writeDisposition del objeto JobConfigurationLoad. El valor predeterminado para Preferencia de escritura es APPEND.
        • DUPLICAR para actualizar los datos dentro de la tabla de destino y reflejar los datos modificados en la fuente. MIRROR reemplaza una copia nueva de datos en la tabla de destino.

      • En Borrar archivos de origen después de la transferencia (Delete source files after transfer), marca la casilla si quieres borrar los archivos de origen después de cada transferencia exitosa. Los trabajos de borrado son el mejor esfuerzo. Los trabajos de borrado no se vuelven a intentar si el primer esfuerzo para borrar los archivos de origen falló.

      • En la sección Opciones de transferencia (Transfer Options), sigue estos pasos:

        • En Todos los formatos (All Formats), haz lo siguiente:
          • En Cantidad de errores permitidos (Number of errors allowed), ingresa la cantidad máxima de registros erróneos que BigQuery puede ignorar cuando ejecute el trabajo. Si la cantidad de registros erróneos supera este valor, el trabajo falla y se muestra un error de validez en el resultado. El valor predeterminado es 0.
          • En Tipos de destino decimal, ingresa una lista separada por comas de los tipos de datos de SQL posibles en los que se podrían convertir los valores decimales de origen (opcional). El tipo de datos SQL que se seleccione para la conversión dependerá de las siguientes condiciones:
            • El tipo de datos seleccionado para la conversión será el primer tipo de datos en la siguiente lista que admite 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 enumerados admitirá la precisión y la escala, se seleccionará el tipo de datos que admita el rango más amplio en la lista especificada. Se mostrará un error si un valor excede el rango admitido cuando se leen los datos de origen.
            • El tipo de datos STRING admite todos los valores de precisión y escalamiento.
            • Si este campo se deja vacío, el tipo de datos predeterminado será "NUMERIC, STRING" para ORC y "NUMERIC" para los otros formatos de archivo.
            • Este campo no puede contener tipos de datos duplicados.
            • Se ignora el orden de los tipos de datos que enumeras en este campo.
        • En JSON, CSV, haz lo siguiente:
          • En Ignorar valores desconocidos (Ignore unknown values), marca la casilla si quieres que la transferencia descarte los datos que no coincidan con el esquema de la tabla de destino.
        • En CSV, haz lo siguiente:

          • En Delimitador de campo (Field delimiter), ingresa el carácter que separa los campos. El valor predeterminado es una coma.
          • En Filas de encabezado para omitir (Header rows to skip), ingresa la cantidad de filas de encabezado de los archivos de origen si no quieres importarlas. El valor predeterminado es 0.
          • En Permitir saltos de línea con comillas (Allow quoted newlines), marca la casilla si quieres permitir saltos de línea en campos entrecomillados.
          • En Permitir filas irregulares (Allow jagged rows), marca la casilla de verificación si quieres permitir que se transfieran filas con columnas NULLABLE faltantes.

      Detalles de la fuente de Cloud Storage

    • De forma opcional, en la sección Opciones de notificación (Notifications options), haz lo siguiente:

      • Haz clic en el botón de activación para habilitar las notificaciones por correo electrónico. Cuando habilitas esta opción, el administrador de transferencias recibe una notificación por correo electrónico cuando falla una ejecución de transferencia.
      • En Seleccionar un tema de Cloud Pub/Sub (Select a Cloud Pub/Sub topic), elige el nombre de tu tema o haz clic en Crear un tema (Create a topic). Con esta opción, se configuran las notificaciones de ejecución de Pub/Sub para tu transferencia.
  5. Haga clic en Save.

bq

Ingresa el comando bq mk y suministra la marca de creación de transferencias --transfer_config. También se requieren las siguientes marcas:

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

Aquí:

  • project_id es el ID del proyecto. Si no proporcionas --project_id para especificar un proyecto en particular, se usa el proyecto predeterminado.
  • data_source es la fuente de datos: google_cloud_storage.
  • name es el nombre visible de la configuración de transferencia. El nombre de la transferencia puede ser cualquier valor que te permita identificarla con facilidad si necesitas modificarla más tarde.
  • dataset es el conjunto de datos de destino para la configuración de la transferencia.
  • parameters contiene los parámetros para la configuración de la transferencia creada en formato JSON. Por ejemplo: --params='{"param":"param_value"}'
    • Para Cloud Storage, debes proporcionar los parámetros data_path_template, destination_table_name_template y file_format. data_path_template es el URI de Cloud Storage que contiene los archivos que se van a transferir, que puede incluir un comodín. destination_table_name_template es el nombre de tu tabla de destino. Para file_format, indica el tipo de archivos que deseas transferir: CSV, JSON, AVRO, PARQUET o ORC. El valor predeterminado es CSV.
    • Para todos los valores file_format, puedes incluir el parámetro opcional max_bad_records. El valor predeterminado es 0.
    • Para todos los valores file_format, puedes incluir el parámetro opcional decimal_target_types. decimal_target_types es una lista separada por comas de posibles tipos de datos de SQL en los que se pueden convertir los valores decimales de origen. Si no se proporciona este campo, el tipo de datos predeterminado será "NUMERIC, STRING" para ORC y "NUMERIC" para los otros formatos de archivo.
    • Para los valores JSON o CSV en file_format, puedes incluir el parámetro opcional ignore_unknown_values. Este parámetro se ignorará si no has seleccionado CSV o JSON para file_format.
    • Para file_format de CSV, puedes incluir el parámetro opcional field_delimiter del carácter que separa los campos. El valor predeterminado es una coma. Este parámetro se ignorará si no has seleccionado CSV para file_format.
    • Para el file_format de CSV, puedes incluir el parámetro skip_leading_rows opcional a fin de indicar las filas de encabezado que no deseas importar. El valor predeterminado es 0. Este parámetro se ignorará si no has seleccionado CSV para file_format.
    • Para file_format de CSV, puedes incluir el parámetro opcional allow_quoted_newlines si deseas permitir saltos de línea dentro de los campos entre comillas. Este parámetro se ignorará si no has seleccionado CSV para file_format.
    • Para file_format de CVS, puedes incluir el parámetro opcional allow_jagged_rows si deseas aceptar filas a las que les faltan columnas opcionales finales. Los valores que faltan se llenarán con valores NULL. Este parámetro se ignorará si no has seleccionado CSV para file_format.
    • El parámetro opcional delete_source_files borrará los archivos de origen después de cada transferencia exitosa. Los trabajos de borrado no se vuelven a intentar si el primer esfuerzo para borrar los archivos de origen falló. El valor predeterminado de delete_source_files es falso.

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

La transferencia se crea en el proyecto predeterminado:

bq mk --transfer_config \
--target_dataset=mydataset \
--display_name='My Transfer' \
--params='{"data_path_template":"gs://mybucket/myfile/*.csv",
"destination_table_name_template":"MyTable",
"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",
"delete_source_files":"true"}' \
--data_source=google_cloud_storage

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 suministra una instancia del recurso TransferConfig.

Java

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 google cloud storage transfer config
public class CreateCloudStorageTransfer {

  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";
    // GCS Uri
    String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv";
    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("data_path_template", Value.newBuilder().setStringValue(sourceUri).build());
    params.put("write_disposition", Value.newBuilder().setStringValue("APPEND").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());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDisplayName("Your Google Cloud Storage Config Name")
            .setDataSourceId("google_cloud_storage")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    createCloudStorageTransfer(projectId, transferConfig);
  }

  public static void createCloudStorageTransfer(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("Cloud storage transfer created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Cloud storage transfer was not created." + ex.toString());
    }
  }
}

Activa una transferencia de forma manual

Además de las transferencias programadas automáticamente desde Cloud Storage, puedes activar de forma manual una transferencia para cargar archivos de datos adicionales.

Si la configuración de la transferencia está parametrizada en el entorno de ejecución, deberás especificar un rango de fechas durante el cual se iniciarán transferencias adicionales.

Para activar manualmente una transferencia, haz lo siguiente:

Console

  1. Ve a la página de BigQuery en Cloud Console.

    Ir a la página de BigQuery

  2. Haga clic en Transferencias de datos.

  3. Haz clic en tu transferencia.

  4. Haz clic en RUN TRANSFER NOW o SCHEDULE BACKFILL (para configurar opciones de transferencia con parámetros de ejecución).

  5. Si corresponde, elige la Fecha de inicio y la Fecha de finalización y, luego, haz clic en Aceptar para confirmar.

    EJECUTAR TRANSFERENCIA AHORA

    En el caso de las configuraciones de transferencia con parámetros de entorno de ejecución, verás opciones de fechas cuando hagas clic en SCHEDULE BACKFILL.

    PROGRAMAR reabastecimiento

¿Qué sigue?