Guía de traducción de SQL de Snowflake
En este documento, se detallan las similitudes y diferencias que existen en la sintaxis de SQL entre Snowflake y BigQuery para ayudar a acelerar la planificación y ejecución de la transferencia de tu EDW (almacén de datos empresariales) a BigQuery. El almacenamiento de datos de Snowflake está diseñado para funcionar con la sintaxis de SQL específica de Snowflake. Es posible que las secuencias de comandos escritas para Snowflake necesiten modificarse antes de que puedas usarlas en BigQuery, ya que los dialectos de SQL varían según los servicios. Usa la traducción de SQL por lotes para migrar tus secuencias de comandos de SQL de forma masiva o la traducción de SQL interactiva para traducir consultas ad hoc. Snowflake SQL es compatible con ambas herramientas en la versión preliminar.
Tipos de datos
En esta sección, se muestran los equivalentes entre los tipos de datos en Snowflake y en BigQuery.
| Snowflake | BigQuery | Notas |
|---|---|---|
NUMBER/
DECIMAL/NUMERIC |
NUMERIC/BIGNUMERIC |
Se puede asignar a NUMERIC o BIGNUMERIC, según la precisión y la escala.El tipo de datos NUMBER en Snowflake admite 38 dígitos de precisión y 37 dígitos de escala. La precisión y la escala se pueden especificar según el usuario.BigQuery admite NUMERIC y BIGNUMERIC con precisión y escalamiento especificados de forma opcional dentro de ciertos límites. |
INT/INTEGER |
BIGNUMERIC |
INT/INTEGER y todos los demás tipos de datos similares a INT, como BIGINT, TINYINT, SMALLINT, BYTEINT, representan un alias para el tipo de datos NUMBER en el que la precisión y la escala no se pueden especificar y siempre son NUMBER(38, 0)BigQuery convierte INTEGER en INT64 de forma predeterminada. Para configurar la traducción de SQL de modo que se convierta a otros tipos de datos, puedes usar la opción de configuración REWRITE_ZERO_SCALE_NUMERIC_AS_INTEGER. |
BIGINT |
BIGNUMERIC |
|
SMALLINT |
BIGNUMERIC |
|
TINYINT |
BIGNUMERIC |
|
BYTEINT |
BIGNUMERIC |
|
FLOAT/ |
FLOAT64 |
El tipo de datos FLOAT en Snowflake establece “NaN” como > X, en el que X es cualquier valor FLOAT (distinto de “NaN” en sí).El tipo de datos FLOAT en BigQuery establece “NaN” como < X, en el que X es cualquier valor FLOAT (distinto de “NaN” en sí). |
DOUBLE/REAL |
FLOAT64 |
El tipo de datos DOUBLE en Snowflake es sinónimo del tipo de datos FLOAT en Snowflake, pero suele mostrarse de forma incorrecta como FLOAT. Se almacena correctamente como DOUBLE. |
VARCHAR |
STRING |
El tipo de datos VARCHAR en Snowflake tiene una longitud máxima de 128 MB (sin comprimir). Si no se especifica la longitud, el valor predeterminado es la longitud máxima.El tipo de datos STRING en BigQuery se almacena como Unicode codificado en UTF-8 de longitud variable. Para obtener más información sobre los límites de columnas y filas, consulta Trabajos de consulta. |
CHAR/CHARACTER |
STRING |
|
STRING/TEXT |
STRING |
El tipo de datos STRING en Snowflake es sinónimo de VARCHAR de Snowflake. |
BINARY |
BYTES |
|
VARBINARY |
BYTES |
|
BOOLEAN |
BOOL |
El tipo de datos BOOL en BigQuery solo puede aceptar TRUE/FALSE, a diferencia del tipo de datos BOOL en Snowflake, que puede aceptar TRUE/FALSE/NULL. |
DATE |
DATE |
El tipo DATE en Snowflake acepta los formatos de fecha más comunes, a diferencia del tipo DATE en BigQuery, que solo acepta fechas en el formato “AAAA-[M]M-[D]D”. |
TIME |
TIME |
El tipo TIME en Snowflake admite entre 0 y 9 nanosegundos de precisión, mientras que el tipo TIME en BigQuery admite entre 0 y 6 nanosegundos de precisión. |
TIMESTAMP |
DATETIME |
TIMESTAMP es un alias configurable por el usuario que se configura de forma predeterminada en TIMESTAMP_NTZ y se asigna a DATETIME en BigQuery. |
TIMESTAMP_LTZ |
TIMESTAMP |
|
TIMESTAMP_NTZ/DATETIME | ||
DATETIME |
||
TIMESTAMP_TZ |
TIMESTAMP |
|
OBJECT |
JSON |
|
VARIANT |
JSON |
|
ARRAY |
ARRAY<JSON> |
El servicio de traducción de SQL conserva el tipo de datos para los arrays con tipo. En el caso de los arrays sin tipo, como ARRAY<VARIANT>, BigQuery los convierte en ARRAY<JSON>. |
BigQuery también tiene los siguientes tipos de datos que no tienen un análogo de Snowflake directo:
Sintaxis de CREATE FUNCTION
En la siguiente tabla, se abordan las diferencias que existen en la sintaxis de creación de UDF de SQL entre Snowflake y BigQuery.
| Snowflake | BigQuery |
|---|---|
|
Nota: En una UDF de SQL de BigQuery, el tipo de datos que se devuelve es opcional. BigQuery infiere el tipo de resultado de la función a partir del cuerpo de la función SQL cuando una consulta llama a la función. |
|
Nota:En la actualidad, la UDF de SQL de BigQuery no es compatible con el tipo de tabla que se muestra, pero está en la hoja de ruta del producto y estará disponible pronto. Sin embargo, BigQuery admite devolver ARRAY de tipo STRUCT. |
|
Nota: Snowflake ofrece una opción segura para restringir la definición de UDF y los detalles solo a los usuarios autorizados (es decir, usuarios a los que se les otorga el rol que posee la vista). |
Nota: La volatilidad de la función no es un parámetro configurable en BigQuery. BigQuery admite la creación de roles y permisos de IAM para restringir el acceso a los datos subyacentes y la definición de las funciones. |
|
Nota: El comportamiento de la función para entradas nulas se maneja de forma implícita en BigQuery y no es necesario especificarlo como una opción independiente. |
|
Nota: La volatilidad de la función no es un parámetro configurable en BigQuery. Toda la volatilidad de la UDF de BigQuery es equivalente a la volatilidad IMMUTABLE de Snowflake (es decir, no realiza búsquedas en bases de datos ni usa información que no está directamente presente en su lista de argumentos). |
|
CREATE [OR REPLACE] FUNCTION
Nota: Usar comillas simples o una secuencia de caracteres como símbolos de dólares$$) is not required or supported in BigQuery. BigQuery implicitly interprets the SQL expression. |
|
Note: Adding comments or descriptions in UDFs is not supported in BigQuery. |
|
Note: BigQuery supports using ANY TYPE as argument type. The function will accept an input of any type for this argument. For more information, see templated parameter in BigQuery. |
BigQuery also supports the CREATE FUNCTION IF NOT EXISTSstatement
which treats the query as successful and takes no action if a function with the
same name already exists.
BigQuery's CREATE FUNCTIONstatement also supports creating
TEMPORARY or TEMP functions, which do
not have a Snowflake equivalent. See
calling UDFs
for details on executing a BigQuery persistent UDF.
DROP FUNCTION syntax
The following table addresses differences in DROP FUNCTION syntax between Snowflake and BigQuery.
| Snowflake | BigQuery |
|---|---|
|
Note: BigQuery does not require using the function's signature (argument data type) for deleting the function. |
BigQuery requires that you specify the project_name if the function
is not located in the current project.
Additional function commands
This section covers additional UDF commands supported by Snowflake that are not directly available in BigQuery.
ALTER FUNCTION syntax
Snowflake supports the following operations using
ALTER FUNCTION
syntax.
- Renaming a UDF
- Converting to (or reverting from) a secure UDF
- Adding, overwriting, removing a comment for a UDF
As configuring function security and adding function comments is not available
in BigQuery, ALTER FUNCTION syntax is not supported. However,
the CREATE FUNCTION
statement can be used to create a UDF with the same function definition but a
different name.
DESCRIBE FUNCTION syntax
Snowflake supports describing a UDF using DESC[RIBE] FUNCTION syntax. This is not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.
SHOW USER FUNCTIONS syntax
In Snowflake, SHOW USER FUNCTIONS syntax can be used to list all UDFs for which users have access privileges. This is not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.
Stored procedures
Snowflake stored procedures are written in JavaScript, which can execute SQL statements by calling a JavaScript API. In BigQuery, stored procedures are defined using a block of SQL statements.
CREATE PROCEDURE syntax
In Snowflake, a stored procedure is executed with a CALL command while in BigQuery, stored procedures are executed like any other BigQuery function.
The following table addresses differences in stored procedure creation syntax between Snowflake and BigQuery.
| Snowflake | BigQuery |
|---|---|
|
Note: Snowflake requires that stored procedures return a single value. Hence, return data type is a required option. |
CREATE [OR REPLACE] PROCEDURE
Note: BigQuery doesn't support a return type for stored procedures. Also, it requires specifying argument mode for each argument passed. |
|
|
|
CREATE [OR REPLACE] PROCEDURE
Nota: El comportamiento de procedimientos para entradas nulas se maneja de forma implícita en BigQuery y no es necesario especificar como una opción independiente. |
CREATE [OR REPLACE] PROCEDURE
|
Nota: La volatilidad de procedimiento no es un parámetro configurable en BigQuery. Es equivalente a la volatilidad IMMUTABLE de Snowflake. |
CREATE [OR REPLACE] PROCEDURE
|
Nota: En BigQuery, no se admite la adición de comentarios o descripciones en las definiciones de procedimientos. |
CREATE [OR REPLACE] PROCEDURE
Nota: Snowflake admite la especificación del emisor o propietario del procedimiento para la ejecución |
Nota: Los procedimientos almacenados de BigQuery siempre se ejecutan como el emisor |
BigQuery también admite la declaración CREATE PROCEDURE IF NOT EXISTS, que trata la consulta como correcta y no realiza ninguna acción si ya existe una función con el mismo nombre.
Sintaxis de DROP PROCEDURE
En la siguiente tabla, se abordan las diferencias que existen en la sintaxis de DROP FUNCTION entre Snowflake y BigQuery.
| Snowflake | BigQuery |
|---|---|
|
Nota: BigQuery no requiere el uso de la firma del procedimiento (tipo de datos de argumento) para borrarlo. |
BigQuery requiere que especifiques el project_name si el procedimiento no se encuentra en el proyecto actual.
Comandos de procedimiento adicionales
Snowflake proporciona comandos adicionales, como los siguientes:ALTER PROCEDURE, DESC[RIBE] PROCEDURE y SHOW PROCEDURES para administrar los procedimientos almacenados. No son compatibles con BigQuery.
Instrucciones de SQL de transacciones y metadatos
| Snowflake | BigQuery |
|---|---|
|
BigQuery siempre usa el aislamiento de instantáneas. Para obtener más información, consulta Garantías de coherencia en este documento. |
|
No se usa en BigQuery. |
|
No se usa en BigQuery. |
|
No se usa en BigQuery. |
Instrucciones de SQL de varias instrucciones y varias líneas
Snowflake y BigQuery admiten transacciones (sesiones) y, por lo tanto, admiten declaraciones separadas por punto y coma que se ejecutan juntas de manera coherente. Para obtener más información, consulta Transacciones de varias declaraciones.
Columnas de metadatos para archivos almacenados en etapa intermedia
Snowflake genera metadatos de forma automática para archivos en etapas internas y externas. Estos metadatos se pueden consultar y cargar en una tabla junto con las columnas de datos regulares. Se pueden usar las siguientes columnas de metadatos:
Garantías de coherencia y aislamiento de transacción
Tanto Snowflake como BigQuery son atómicos, es decir, cumplen con el estándar ACID en un nivel por transformación en muchas filas.
Transacciones
A cada transacción de Snowflake se le asigna una hora de inicio única (incluye milisegundos) que se establece como el ID de transacción. Snowflake solo admite el nivel de aislamiento READ COMMITTED. Sin embargo, una declaración puede ver los cambios que realizó otra declaración si ambas están en la misma transacción, aunque esos cambios aún no se confirmaron. Las transacciones de Snowflake adquieren bloqueos en los recursos (tablas) cuando se modifica ese recurso. Los usuarios pueden ajustar el tiempo máximo que una declaración bloqueada esperará hasta que se agote el tiempo de espera de la declaración. Las declaraciones DML se confirman de forma automática si el parámetro AUTOCOMMIT está activado.
BigQuery también admite transacciones. BigQuery ayuda a garantizar el control de simultaneidad optimista (gana el primero en confirmar) con el aislamiento de instantáneas, de modo que una consulta lea los últimos datos que se confirmaron antes de comenzar la consulta. Este enfoque garantiza el mismo nivel de coherencia por fila, por transformación y entre filas dentro de la misma declaración DML y evita los interbloqueos. En el caso de varias actualizaciones de DML en la misma tabla, BigQuery cambia al control de simultaneidad pesimista. Los trabajos de carga pueden ejecutarse de forma independiente por completo y agregarse a las tablas. Sin embargo, BigQuery no proporciona una sesión o un límite de transacción explícitos.
Revertir
Si la sesión de una transacción de Snowflake se cierra de forma inesperada antes de que la transacción se confirme o se revierta, la transacción queda en un estado desconectado. El usuario debe ejecutar SYSTEM$ABORT_TRANSACTION para anular la transacción desconectada o Snowflake revertirá la transacción desconectada después de cuatro horas inactivas. Si se produce un interbloqueo, Snowflake detecta el interbloqueo y selecciona la declaración más reciente para revertir. Si la declaración DML en una transacción abierta de manera explícita falla, los cambios se revierten, pero la transacción se mantiene abierta hasta que se confirma o se revierte. Las declaraciones DDL en Snowflake no se pueden revertir, ya que se confirman de forma automática.
BigQuery es compatible con la declaración ROLLBACK TRANSACTION.
No hay una declaración ABORT en BigQuery.
Límites de bases de datos
Siempre consulta la documentación pública de BigQuery para conocer las cuotas y los límites actuales. Para aumentar las cuotas de los usuarios de gran volumen, comunícate con el equipo de Asistencia de Cloud.
Todas las cuentas de Snowflake tienen límites flexibles establecidos de forma predeterminada. Los límites flexibles se establecen durante la creación de la cuenta y pueden variar. Muchos límites flexibles de Snowflake se pueden aumentar a través del equipo de cuentas de Snowflake o un ticket de asistencia.
En la siguiente tabla, se muestra una comparación de los límites de bases de datos de Snowflake y BigQuery.
| Límite | Snowflake | BigQuery |
|---|---|---|
| Tamaño del texto de la consulta | 1 MB | 1 MB |
| Cantidad máxima de consultas simultáneas | XS Warehouse - 8 S Warehouse - 16 M Warehouse - 32 L Warehouse - 64 XL Warehouse - 128 |
100 |