Detección y asignación de esquemas para Snowflake

En esta guía, se muestra cómo definir tu esquema cuando transfieres datos de Snowflake a BigQuery. Puedes usar el Servicio de transferencia de datos de BigQuery para detectar automáticamente la asignación de esquemas y tipos de datos, o puedes usar el motor de traducción para definir el esquema y los tipos de datos de forma manual.

Habilita la detección automática de esquemas predeterminados

El conector de Snowflake puede detectar automáticamente el esquema de tu tabla de Snowflake. Para usar la detección automática de esquemas, puedes dejar en blanco el campo Ruta de acceso de GCS de salida de traducción cuando configures una transferencia de Snowflake.

En la siguiente lista, se muestra cómo el conector de Snowflake asigna tus tipos de datos de Snowflake a BigQuery:

  • Los siguientes tipos de datos se asignan como STRING en BigQuery:
    • TIMESTAMP_TZ
    • TIMESTAMP_LTZ
    • OBJECT
    • VARIANT
    • ARRAY
  • Los siguientes tipos de datos se asignan como TIMESTAMP en BigQuery:
    • TIMESTAMP_NTZ

Todos los demás tipos de datos de Snowflake se asignan directamente a sus tipos equivalentes en BigQuery.

Define el esquema de forma manual con el resultado del motor de traducción

El conector del Servicio de transferencia de datos de BigQuery para Snowflake usa el motor de traducción del servicio de migración de BigQuery para la asignación de esquemas cuando se migran tablas de Snowflake a BigQuery.

Para definir tu esquema de forma manual (por ejemplo, para anular ciertos atributos del esquema), puedes generar tus metadatos y, luego, ejecutar el motor de traducción.

Limitaciones

  • Los datos se extraen de Snowflake en el formato de datos de Parquet antes de cargarse en BigQuery:

    • No se admiten los siguientes tipos de datos de Parquet:
    • Los siguientes tipos de datos de Parquet no son compatibles, pero se pueden convertir:

      • TIMESTAMP_NTZ
      • OBJECT, VARIANT, ARRAY

      Usa el YAML de configuración de conversión de tipo global para anular el comportamiento predeterminado de estos tipos de datos cuando ejecutes el motor de traducción.

      El YAML de configuración podría ser similar al siguiente ejemplo:

      type: experimental_object_rewriter
      global:
        typeConvert:
          datetime: TIMESTAMP
          json: VARCHAR
      

Permisos de cuenta de servicio obligatorios

En una transferencia de Snowflake, se usa una cuenta de servicio para leer los datos del resultado del motor de traducción en la ruta de acceso de Cloud Storage especificada. Debes otorgar a la cuenta de servicio los permisos storage.objects.get y storage.objects.list.

Recomendamos que la cuenta de servicio pertenezca al mismo proyecto de Google Cloud en el que se crean la configuración de transferencia y el conjunto de datos de destino. Si la cuenta de servicio se encuentra en un proyecto de Google Cloud que es diferente del proyecto que creó la transferencia de datos de BigQuery, debes habilitar la autorización de la cuenta de servicio entre proyectos.

Para obtener más información, consulta Roles y permisos de IAM de BigQuery.

Define la asignación de esquemas de forma manual

Puedes definir manualmente la asignación de esquemas con los siguientes pasos:

  1. Ejecuta el dwh-migration-tool para Snowflake. Para obtener más información, consulta Genera metadatos para la traducción y la evaluación.
  2. Sube el archivo metadata.zip generado a un bucket de Cloud Storage. El archivo metadata.zip se usa como entrada para el motor de traducción.
  3. Ejecuta el servicio de traducción por lotes y especifica el campo target_types como metadata. Para obtener más información, consulta Traduce consultas en SQL con la API de Translation.

    • A continuación, se muestra un ejemplo de un comando para ejecutar una traducción por lotes para Snowflake:
      curl -d "{
      \"name\": \"sf_2_bq_translation\",
      \"displayName\": \"Snowflake to BigQuery Translation\",
      \"tasks\": {
          string: {
            \"type\": \"Snowflake2BigQuery_Translation\",
            \"translation_details\": {
                \"target_base_uri\": \"gs://sf_test_translation/output\",
                \"source_target_mapping\": {
                  \"source_spec\": {
                      \"base_uri\": \"gs://sf_test_translation/input\"
                  }
                },
                \"target_types\": \"metadata\",
            }
          }
      },
      }" \
      -H "Content-Type:application/json" \
      -H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2/projects/project_id/locations/location/workflows
    
    • Puedes verificar el estado de este comando en la página Traducción de SQL de BigQuery. El resultado del trabajo de traducción por lotes se almacena en gs://translation_target_base_uri/metadata/config/.

Archivo de esquema personalizado

Te recomendamos que especifiques un esquema personalizado si necesitas capturar información importante sobre una tabla, como la clave primaria, que, de lo contrario, se perdería en la migración. Por ejemplo, cuando realices una transferencia incremental, te recomendamos que especifiques un archivo de esquema personalizado para que los datos de las transferencias posteriores puedan particionarse correctamente cuando se carguen en BigQuery. Sin un archivo de esquema, se puede perder toda la información sobre las claves primarias y el seguimiento de cambios, ya que el Servicio de transferencia de datos de BigQuery aplica automáticamente un esquema de tabla con los datos de origen que se transfieren.

El esquema personalizado también puede ser útil cuando tienes que cambiar los nombres de las columnas o los tipos de datos durante la transferencia de datos.

Un archivo de esquema personalizado es un archivo JSON que describe objetos de base de datos. El esquema contiene un conjunto de bases de datos, cada una de las cuales tiene un conjunto de tablas, y cada una de ellas contiene un conjunto de columnas. Cada objeto tiene un campo originalName, que indica el nombre del objeto en Snowflake, y un campo name, que indica el nombre de destino del objeto en BigQuery.

Las columnas tienen los siguientes campos:

  • originalType: Indica el tipo de datos de la columna en Snowflake.
  • type: Indica el tipo de datos de destino para la columna en BigQuery.
  • usageType: información sobre cómo el sistema usa la columna. Se admiten los siguientes tipos de uso:

    • DEFAULT: Puedes anotar varias columnas en una tabla con este tipo de uso. El tipo de uso DEFAULT indica que la columna no tiene un uso especial en el sistema de origen. Este es el valor predeterminado.
    • PRIMARY_KEY: Puedes anotar columnas en cada tabla de destino con este tipo de uso. Usa el tipo de uso PRIMARY_KEY para identificar solo una columna como la clave primaria o, en el caso de una clave compuesta, usa el mismo tipo de uso en varias columnas para identificar las entidades únicas de una tabla. Estas columnas trabajan junto con COMMIT_TIMESTAMP para extraer filas creadas o actualizadas desde la última ejecución de la transferencia.

En el siguiente ejemplo, se muestra un archivo de esquema personalizado para transferir una tabla de Snowflake llamada orders en la base de datos my_db, cambiar el nombre de la columna O_ORDERKEY a ORDERKEY y, además, identificar O_ORDERSTATUS como la clave primaria.

{
  "databases": [
    {
      "name": "my_db",
      "originalName": "my_db",
      "tables": [
        {
          "name": "orders",
          "originalName": "orders",
          "columns": [
            {
              "name": "ORDERKEY",
              "originalName": "O_ORDERKEY",
              "type": "INT64",
              "originalType": "NUMERIC",
              "usageType": [
                "PRIMARY_KEY"
              ],
              "isRequired": true,
              "originalColumnLength": 4
            },
            {
              "name": "O_ORDERSTATUS",
              "originalName": "O_ORDERSTATUS",
              "type": "STRING",
              "originalType": "VARCHAR",
              "usageType": [
                "DEFAULT"
              ],
              "isRequired": true,
              "originalColumnLength": 1
            }
          ]
        }
      ]
    }
  ]
}