Migración de la tabla de exportación de perfiles de Snowflake a una tabla híbrida
Objetivos del artículo
Aprende a convertir la tabla KLAVIYO_PROFILE a la que escribe la exportación del almacén de datos de Klaviyo en Snowflake, de una tabla estándar a una tabla híbrida de Snowflake, con los comandos exactos que debes ejecutar en cada paso.
La sincronización de exportación de Klaviyo escribe en KLAVIYO_PROFILE con un MERGE (upsert) en cada ejecución periódica. Las tablas híbridas son un tipo de tabla de Snowflake creado para lecturas y escrituras puntuales basadas en índices y de baja latencia, por lo que la conversión reduce el tiempo y el costo de esas operaciones MERGE; esto se mantiene independientemente de cómo leas la tabla después, así que vale la pena hacerlo incluso si solo ejecutas análisis y agregaciones de gran escala más adelante. Si también usas KLAVIYO_PROFILE para servir búsquedas individuales de perfiles a una aplicación, una interfaz de programación de aplicaciones (API) o una IU, una tabla híbrida también devuelve esas búsquedas más rápido.
Advanced Klaviyo Data Platform no está incluido en la aplicación de marketing estándar de Klaviyo, y se requiere una suscripción para acceder a la funcionalidad asociada. Visita nuestra guía de facturación para saber cómo contratar este plan.
Las tablas híbridas son una función de Snowflake, no de Klaviyo. La sincronización de exportación de Klaviyo escribe en KLAVIYO_PROFILE con SQL estándar y no requiere un tipo de tabla específico, pero las tablas híbridas no forman parte del script de configuración de Snowflake documentado de Klaviyo. Ejecuta esta migración primero en una base de datos que no sea de producción y ten en cuenta que Snowflake mide el almacenamiento y las solicitudes de las tablas híbridas de manera diferente a las tablas estándar.
Antes de empezar
Necesitarás todo lo siguiente:
- Un destino de Snowflake que ya está configurado y sincronizando. Consulta Comprende la sincronización con el almacén de datos en Klaviyo.
- Un rol con CREATE TABLE en el esquema que contiene KLAVIYO_PROFILE (SYSADMIN en el script de configuración de Klaviyo) y un rol que pueda conceder privilegios (SECURITYADMIN).
- Una cuenta que admita tablas híbridas. Las tablas híbridas suelen estar disponibles de forma general solo en regiones comerciales de AWS y Microsoft Azure. No están disponibles en Google Cloud, en regiones SnowGov de EE. UU. ni en cuentas de prueba. Los clientes de Virtual Private Snowflake deben ponerse en contacto con Snowflake Support.
- Margen disponible bajo la cuota de almacenamiento híbrido de 2 TB de Snowflake por base de datos.
Completa las cuatro comprobaciones a continuación antes de cambiar nada.
1. Confirma que la cuenta sea compatible con tablas híbridas
Reemplaza KLAVIYO_DATABASE y KLAVIYO_DATA_TRANSFER_WAREHOUSE por los nombres que configuraste en el script de configuración de Snowflake. El script crea la tabla de perfiles a partir de una variable $profile_table, así que sustituye el valor que asignaste allí en cualquier lugar donde este artículo se refiera a KLAVIYO_PROFILE.
USE ROLE SYSADMIN;
USE WAREHOUSE KLAVIYO_DATA_TRANSFER_WAREHOUSE;
USE DATABASE KLAVIYO_DATABASE;
USE SCHEMA PUBLIC;
CREATE OR REPLACE HYBRID TABLE HYBRID_SMOKE_TEST (ID VARCHAR(32) PRIMARY KEY);
DROP TABLE HYBRID_SMOKE_TEST; Si alguna de las dos afirmaciones falla, las tablas híbridas no están habilitadas para tu cuenta o región, y debes detenerte aquí.
2. Define el tamaño de la tabla de perfiles
SELECT
ROW_COUNT,
BYTES / POWER(1024, 3) AS SIZE_GB
FROM KLAVIYO_DATABASE.INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'PUBLIC'
AND TABLE_NAME = 'KLAVIYO_PROFILE'; Las tablas híbridas usan almacenamiento principal basado en filas, por lo que, por lo general, los mismos datos ocupan más espacio que en una tabla estándar columnar. Considera la cifra SIZE_GB como un mínimo, no como una estimación, y deja espacio dentro de la cuota de 2 TB por base de datos.
3. Comprueba si hay ID duplicados o nulos
El script de configuración de Klaviyo ya declara la clave primaria (ID) en la tabla estándar, pero Snowflake no aplica claves primarias en tablas estándar. Las tablas híbridas sí las aplican, por lo que los ID duplicados o nulos que antes se toleraban ahora bloquearán la carga. Ambas consultas deben devolver 0.
SELECT COUNT(*) AS DUPLICATE_IDS
FROM (
SELECT ID
FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
GROUP BY ID
HAVING COUNT(*) > 1
);
SELECT COUNT(*) AS NULL_IDS
FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
WHERE ID IS NULL; Si cualquiera de los dos devuelve un valor distinto de cero, resuelve el problema de calidad de datos en la tabla estándar antes de continuar. De lo contrario, la carga en el paso 2 fallará.
4. Verifica las dependencias posteriores
Las tablas híbridas no admiten claves de agrupamiento, uso compartido de datos, tablas dinámicas, Fail-safe, vistas materializadas, Query Acceleration Service, replicación, Search Optimization Service, Snowpipe, Snowpipe Streaming, flujos o UNDROP. Time Travel se admite con limitaciones.
SELECT
REFERENCING_DATABASE,
REFERENCING_SCHEMA,
REFERENCING_OBJECT_NAME,
REFERENCING_OBJECT_DOMAIN
FROM SNOWFLAKE.ACCOUNT_USAGE.OBJECT_DEPENDENCIES
WHERE REFERENCED_OBJECT_NAME = 'KLAVIYO_PROFILE'; Si algo de lo que está más abajo depende de una función no compatible, vuelve a crearlo antes de migrar.
Paso 1: Pon en pausa la sincronización de exportación
En Klaviyo, ve a Advanced Klaviyo Data Platform > Gestión de datos > Sincronización, haz clic en tu destino de Snowflake, abre la pestaña Periódica y selecciona Pausar.
Espera hasta que cualquier sincronización en curso muestre el estado Completed o Paused antes de continuar. Migrar mientras una sincronización está escribiendo en la tabla puede eliminar filas.
Paso 2: Crear la tabla híbrida y cargarla
CREATE HYBRID TABLE ... AS SELECT requiere que declares explícitamente el esquema completo de columnas; no se puede inferir a partir del SELECT. Usa los mismos nombres de columnas y tipos de datos que la tabla existente para que la sincronización de Klaviyo siga escribiendo en ella sin cambios.
USE ROLE SYSADMIN;
USE WAREHOUSE KLAVIYO_DATA_TRANSFER_WAREHOUSE;
USE DATABASE KLAVIYO_DATABASE;
USE SCHEMA PUBLIC;
CREATE OR REPLACE HYBRID TABLE KLAVIYO_PROFILE_HYBRID (
ID VARCHAR(32) NOT NULL,
EXTERNAL_ID VARCHAR(255),
EMAIL VARCHAR(255),
PHONE_NUMBER VARCHAR(255),
FIRST_NAME VARCHAR(255),
LAST_NAME VARCHAR(255),
TITLE VARCHAR(255),
ORGANIZATION VARCHAR(255),
PROPERTIES OBJECT,
IMAGE VARCHAR(255),
CREATED TIMESTAMP_NTZ(9),
UPDATED TIMESTAMP_NTZ(9),
LOCATION_ADDRESS1 VARCHAR(255),
LOCATION_ADDRESS2 VARCHAR(255),
LOCATION_CITY VARCHAR(255),
LOCATION_COUNTRY VARCHAR(255),
LOCATION_LATITUDE VARCHAR(255),
LOCATION_LONGITUDE VARCHAR(255),
LOCATION_REGION VARCHAR(255),
LOCATION_ZIP VARCHAR(255),
PRIMARY KEY (ID)
)
AS
SELECT
ID,
EXTERNAL_ID,
EMAIL,
PHONE_NUMBER,
FIRST_NAME,
LAST_NAME,
TITLE,
ORGANIZATION,
PROPERTIES,
IMAGE,
CREATED,
UPDATED,
LOCATION_ADDRESS1,
LOCATION_ADDRESS2,
LOCATION_CITY,
LOCATION_COUNTRY,
LOCATION_LATITUDE,
LOCATION_LONGITUDE,
LOCATION_REGION,
LOCATION_ZIP
FROM KLAVIYO_PROFILE; - La sesión debe tener un almacén en ejecución configurado, o CREATE HYBRID TABLE devuelve un error.
- PROPERTIES se mantiene como una columna de tipo OBJECT. Las columnas semiestructuradas se admiten en tablas híbridas siempre que no estén indexadas.
- CTAS en una tabla híbrida vacía usa la ruta optimizada de carga masiva de Snowflake. En el perfil de consulta de Snowsight, Number of rows inserted aparece como Number of rows bulk loaded cuando se usa la ruta rápida.
- Si la sentencia falla por una restricción, se coló un ID duplicado o nulo durante la verificación anterior. Arréglalo en la tabla estándar y vuelve a ejecutar.
Cargar una tabla muy grande por lotes
Si una sola CTAS es demasiado grande para ejecutarse cómodamente, crea la tabla híbrida vacía y cárgala en rangos de fechas. INSERT INTO ... SELECT también usa la ruta optimizada de carga masiva.
CREATE OR REPLACE HYBRID TABLE KLAVIYO_PROFILE_HYBRID (
ID VARCHAR(32) NOT NULL,
EXTERNAL_ID VARCHAR(255),
EMAIL VARCHAR(255),
PHONE_NUMBER VARCHAR(255),
FIRST_NAME VARCHAR(255),
LAST_NAME VARCHAR(255),
TITLE VARCHAR(255),
ORGANIZATION VARCHAR(255),
PROPERTIES OBJECT,
IMAGE VARCHAR(255),
CREATED TIMESTAMP_NTZ(9),
UPDATED TIMESTAMP_NTZ(9),
LOCATION_ADDRESS1 VARCHAR(255),
LOCATION_ADDRESS2 VARCHAR(255),
LOCATION_CITY VARCHAR(255),
LOCATION_COUNTRY VARCHAR(255),
LOCATION_LATITUDE VARCHAR(255),
LOCATION_LONGITUDE VARCHAR(255),
LOCATION_REGION VARCHAR(255),
LOCATION_ZIP VARCHAR(255),
PRIMARY KEY (ID)
);
INSERT INTO KLAVIYO_PROFILE_HYBRID
SELECT * FROM KLAVIYO_PROFILE
WHERE UPDATED < '2024-01-01';
INSERT INTO KLAVIYO_PROFILE_HYBRID
SELECT * FROM KLAVIYO_PROFILE
WHERE UPDATED >= '2024-01-01' AND UPDATED < '2025-01-01';
INSERT INTO KLAVIYO_PROFILE_HYBRID
SELECT * FROM KLAVIYO_PROFILE
WHERE UPDATED >= '2025-01-01' OR UPDATED IS NULL; Ajusta los límites para que se adapten a los datos y asegúrate de que los rangos no se superpongan ni dejen espacios.
Paso 3: Agrega índices secundarios
La clave principal en ID se indexa automáticamente. Agrega índices secundarios solo para las columnas en las que realmente filtras, porque cada índice consume almacenamiento y agrega costos a cada escritura. Si buscas perfiles por EMAIL o EXTERNAL_ID, indexa esas columnas; si también filtras u ordenas por recencia (por ejemplo, al obtener perfiles actualizados desde un momento determinado), indexa UPDATED también.
CREATE INDEX IDX_KLAVIYO_PROFILE_EMAIL
ON KLAVIYO_PROFILE_HYBRID (EMAIL);
CREATE INDEX IDX_KLAVIYO_PROFILE_EXTERNAL_ID
ON KLAVIYO_PROFILE_HYBRID (EXTERNAL_ID);
CREATE INDEX IDX_KLAVIYO_PROFILE_UPDATED
ON KLAVIYO_PROFILE_HYBRID (UPDATED); No agregues restricciones UNIQUE a EMAIL, PHONE_NUMBER o EXTERNAL_ID. Los perfiles de Klaviyo pueden tener un valor nulo o repetido en cualquiera de estas columnas, y las tablas híbridas aplican restricciones UNIQUE, lo que haría que tu sincronización fallara.
- No puedes indexar PROPERTIES. No se pueden indexar las columnas semiestructuradas (variante, OBJECT, ARRAY).
- UPDATED y CREATED son TIMESTAMP_NTZ, lo cual es compatible con índices secundarios. TIMESTAMP_TZ no lo es.
- Los índices no se pueden modificar ni se les pueden agregar columnas después de la creación. Elimina y vuelve a crear el índice para cambiarlo.
- Si una carga devuelve "El valor es demasiado largo para el índice", reduce el número de columnas indexadas o el ancho de las columnas indexadas.
Para ver los índices en la tabla:
SHOW INDEXES IN TABLE KLAVIYO_PROFILE_HYBRID; Paso 4: Validar el texto
Los recuentos de filas deben coincidir y la consulta de diferencias debe devolver 0.
SELECT
(SELECT COUNT(*) FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE) AS STANDARD_ROWS,
(SELECT COUNT(*) FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_HYBRID) AS HYBRID_ROWS;
SELECT COUNT(*) AS MISSING_IDS
FROM (
SELECT ID FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
MINUS
SELECT ID FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_HYBRID
); Confirma que la nueva tabla realmente sea híbrida y, luego, valida de forma puntual una lectura puntual comparándola con la misma consulta en la tabla estándar:
SHOW HYBRID TABLES LIKE 'KLAVIYO_PROFILE_HYBRID';
SELECT * FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_HYBRID
WHERE EMAIL = 'someone@example.com'; Paso 5: Intercambia la tabla híbrida a su lugar
Cambia el nombre de la tabla estándar para apartarla, en lugar de eliminarla, para que tengas una ruta de reversión.
USE ROLE SYSADMIN;
USE DATABASE KLAVIYO_DATABASE;
USE SCHEMA PUBLIC;
ALTER TABLE KLAVIYO_PROFILE RENAME TO KLAVIYO_PROFILE_STANDARD_BACKUP;
ALTER TABLE KLAVIYO_PROFILE_HYBRID RENAME TO KLAVIYO_PROFILE; Los privilegios siguen al objeto de la tabla, no al nombre de la tabla. Después de cambiar el nombre, el rol de servicio de Klaviyo no tiene privilegios en el nuevo KLAVIYO_PROFILE y la sincronización fallará hasta que completes el paso 6.
Paso 6: vuelve a conceder privilegios al rol de Klaviyo
Sustituye el nombre del rol que configuraste como role_name en el script de configuración de Snowflake.
USE ROLE SECURITYADMIN;
GRANT SELECT, INSERT, UPDATE, DELETE
ON TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
TO ROLE KLAVIYO_DATA_TRANSFER_ROLE;
SHOW GRANTS ON TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE; Paso 7: Reanuda la sincronización y confirma
En Klaviyo, vuelve a Advanced KDP > Data management > Syncing, haz clic en el destino de Snowflake, abre la pestaña Periodic y selecciona Reanudar.
Las sincronizaciones periódicas se ejecutan cada hora. Después de que se complete el siguiente ciclo, confirma que el estado sea Completado y verifica que los datos se estén registrando:
SELECT
COUNT(*) AS ROW_COUNT,
MAX(UPDATED) AS LAST_UPDATED
FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE; Si la sincronización genera un error, abre la exportación fallida en la pestaña Periodic para leer el resumen del error, el código y el mensaje devuelto por Snowflake. Consulta la sección Ver registros de errores de Comprender la sincronización con el almacén de datos en Klaviyo.
Revertir
Si la sincronización falla con la tabla híbrida y necesitas revertir, pausa la sincronización y vuelve a intercambiar las tablas.
USE ROLE SYSADMIN;
USE DATABASE KLAVIYO_DATABASE;
USE SCHEMA PUBLIC;
ALTER TABLE KLAVIYO_PROFILE RENAME TO KLAVIYO_PROFILE_HYBRID;
ALTER TABLE KLAVIYO_PROFILE_STANDARD_BACKUP RENAME TO KLAVIYO_PROFILE;
USE ROLE SECURITYADMIN;
GRANT SELECT, INSERT, UPDATE, DELETE
ON TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
TO ROLE KLAVIYO_DATA_TRANSFER_ROLE; Luego, reanuda la sincronización. La siguiente sincronización periódica de Klaviyo completa cualquier dato creado o actualizado mientras se reemplazaba la tabla.
Después de migrar
Cuando tengas confianza en la nueva tabla, elimina la copia de seguridad para que deje de generar costos de almacenamiento.
USE ROLE SYSADMIN;
DROP TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_STANDARD_BACKUP; No vuelvas a ejecutar el script de configuración de destino de Snowflake desde Entiende la sincronización del almacén de datos en Klaviyo después de migrar. Ese script usa CREATE OR REPLACE TABLE, lo que reemplazaría la tabla híbrida por una tabla estándar vacía.
Ten en cuenta lo siguiente de forma continua:
- Cuota de almacenamiento: Estás limitado a 2 TB de datos de tabla híbrida por base de datos de Snowflake. Si la excedes, las escrituras en todas las tablas híbridas de esa base de datos se bloquean hasta que vuelvas a estar por debajo de la cuota, lo que hará que falle la sincronización de Klaviyo.
- Cuota de solicitudes: Aproximadamente 16 000 operaciones por segundo por base de datos para una carga de trabajo equilibrada de 80 % de lectura/20 % de escritura.
- Sin modo a prueba de fallos, viaje en el tiempo limitado: UNDROP no es compatible con tablas híbridas. Mantén tu propio proceso de respaldos si necesitas uno.
- Sin caché de resultados: Las consultas a tablas híbridas no usan la caché de resultados de consultas persistentes de Snowflake.
- Costo: El almacenamiento y las solicitudes de tablas híbridas se miden por separado del almacenamiento y el procesamiento de tablas estándar. Revisa la documentación de costos de Snowflake antes de migrar una tabla grande.
Recursos adicionales
- Comprende la sincronización del almacén de datos en Klaviyo
- Conectar Klaviyo y Snowflake
- Snowflake: Tablas híbridas
- Snowflake: Crear tablas híbridas
- Snowflake: Limitaciones y funciones no compatibles para tablas híbridas
- Snowflake: Evaluar el costo de las tablas híbridas
- Snowflake: Convertir tablas estándar de Snowflake en tablas híbridas