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 el esquema y la asignación de tipos de datos, o bien puedes usar el motor de traducción para definir tu esquema y tus tipos de datos de forma manual.

Habilita la detección automática del esquema predeterminado

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 del resultado de la 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.

Cómo definir el esquema de forma manual con la salida 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 formato de datos 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 archivo 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 archivo YAML de configuración podría parecerse al siguiente ejemplo:

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

Permisos obligatorios de la cuenta de servicio

En una transferencia de Snowflake, se usa una cuenta de servicio para leer datos del resultado del motor de traducción en la ruta 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 Cloud de Confiance by S3NS 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 Cloud de Confiance by S3NS diferente del proyecto que creó la transferencia de datos de BigQuery, debes habilitar la autorización de cuentas de servicio entre proyectos.

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

Cómo definir manualmente la asignación del esquema

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

  1. Ejecuta dwh-migration-tool para Snowflake. Si deseas 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 Cómo traducir consultas en SQL con la API de Translation.

    • El siguiente es 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/v2alpha/projects/project_id/locations/location/workflows
    
    • Puedes verificar el estado de este comando en la página Traducción de SQL en 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 debes 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: Es información sobre la forma en que el sistema usa la columna. Se admiten los siguientes tipos de uso:

    • DEFAULT: Puedes anotar varias columnas en una tabla de destino 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, luego, 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
            }
          ]
        }
      ]
    }
  ]
}