Compartir a través de


Cumplimiento de ANSI en Databricks Runtime

Se aplica a:comprobar que se ha marcado sí Databricks Runtime

En este artículo se describe el cumplimiento de ANSI en Databricks Runtime. Para el modo ANSI en Databricks SQL, consulte ANSI_MODE.

Spark SQL tiene dos opciones para admitir el cumplimiento con el estándar ANSI SQL: spark.sql.ansi.enabled y spark.sql.storeAssignmentPolicy.

Cuando spark.sql.ansi.enabled se establece en true, Spark SQL usa un dialecto compatible con ANSI en lugar de compatible con Hive. Por ejemplo, Spark producirá una excepción en tiempo de ejecución en lugar de devolver resultados null si las entradas a una función u operador SQL no son válidas. Es posible que algunas características del dialecto ANSI no provenan directamente del estándar ANSI SQL, pero sus comportamientos se alinean con el estilo de ANSI SQL.

Además, Spark SQL tiene una opción independiente para controlar los comportamientos de conversión implícita al almacenar filas en una tabla. Los comportamientos de conversión se definen como reglas de asignación de almacén en el estándar.

Cuando spark.sql.storeAssignmentPolicy se establece en ANSI, Spark SQL cumple las reglas de asignación de almacén ANSI. Se trata de una configuración independiente porque su valor predeterminado es ANSI, mientras que la configuración spark.sql.ansi.enabled está deshabilitada de forma predeterminada.

En la tabla siguiente se resume este comportamiento:

Nombre de propiedad Valor predeterminado Significado
spark.sql.ansi.enabled falso Cuando el valor sea true, Spark intentará cumplir con la especificación ANSI SQL:
  • Produce una excepción en tiempo de ejecución si se produce un desbordamiento en cualquier operación en un campo entero o decimal.
  • Prohíbe usar las palabras clave reservadas de ANSI SQL como identificadores en el analizador de SQL.
spark.sql.storeAssignmentPolicy ANSI (Instituto Nacional Estadounidense de Estándares) Al almacenar un valor en una columna con un tipo de datos diferente, Spark realizará la conversión de tipo. Actualmente, se admiten 3 directivas para el tipo de reglas de coerción: ANSI, legacy y strict.
  • ANSI: Spark realiza la coerción de tipos según ANSI SQL. En la práctica, el comportamiento es en su mayoría el mismo que PostgreSQL. No permite ciertas conversiones de tipos irrazonables, como convertir "string" a "int" o "double" a "boolean".
  • legacy: con la directiva heredada, Spark permite la coerción de tipo siempre que sea un "Cast" válido, que es muy flexible. Por ejemplo, se permite convertir "string" a "int" o "double" a "boolean". También es el único comportamiento en Spark 2.x y es compatible con Hive.
  • strict: Spark no permite ninguna posible pérdida de precisión ni truncamiento de datos en la coerción de tipos, por ejemplo, no se permite la conversión de double a int o de decimal a double.

Las subsecciones siguientes presentan cambios de comportamiento en operaciones aritméticas, conversiones de tipo y análisis SQL cuando el modo ANSI está habilitado. Existen tres conversiones de tipo en Spark SQL, que se presentan en este artículo una por una: conversión, asignación de almacén y coerción de tipo.

Operaciones aritméticas

En Spark SQL, las operaciones aritméticas realizadas en tipos numéricos (a excepción del decimal) no se comprueban de forma predeterminada para detectar desbordamientos. Esto significa que, en caso de que una operación cause desbordamientos, el resultado es el mismo con la operación correspondiente en un programa de Java o Scala (por ejemplo, si la suma de 2 enteros es mayor que el valor máximo que se puede representar, el resultado es un número negativo). Por otro lado, Spark SQL devuelve null para los desbordamientos decimales. Cuando spark.sql.ansi.enabled se establece en true y se produce un desbordamiento en operaciones aritméticas numéricas y de intervalo, produce una excepción aritmética en tiempo de ejecución.

-- `spark.sql.ansi.enabled=true`
> SELECT 2147483647 + 1;
 error: integer overflow

-- `spark.sql.ansi.enabled=false`
> SELECT 2147483647 + 1;
  -2147483648

Conversión

Cuando spark.sql.ansi.enabled se establece en true, la conversión explícita mediante la sintaxis CAST produce una excepción en tiempo de ejecución para los patrones de conversión no válidos definidos en el estándar, como las conversiones de una cadena a un entero.

La cláusula CAST del modo ANSI de Spark sigue las reglas de sintaxis de la sección 6.13 "Especificación de conversión" de ISO/IEC 9075-2:2011 Tecnología de la información — Lenguajes de bases de datos - SQL — Parte 2: Foundation (SQL/Foundation), con la salvedad de que permite especialmente las siguientes conversiones de tipos sencillas que no se permiten según el estándar ANSI:

  • TipoNumérico <=> TipoBooleano
  • StringType <=> BinaryType

La tabla siguiente ofrece las combinaciones válidas del tipo de datos de origen y de destino en una expresión CAST. "Y" indica que la combinación es sintácticamente válida sin restricciones y "N" indica que la combinación no es válida.

SourceTarget Numérico Cuerda Fecha Marca de tiempo Intervalo Booleano Binario Arreglo Mapa Estructura
Numérico S S N N N S N N N N
Cuerda S S S S S S S N N N
Fecha N S S S N N N N N N
Marca de tiempo N S S S N N N N N N
Intervalo N S N N S N N N N N
Booleano S S N N N S N N N N
Binario S N N N N N S N N N
Arreglo N N N N N N N S N N
Mapa N N N N N N N N S N
Estructura N N N N N N N N N S
-- Examples of explicit casting

-- `spark.sql.ansi.enabled=true`
> SELECT CAST('a' AS INT);
  ERROR: [CAST_INVALID_INPUT] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed.

> SELECT CAST(2147483648L AS INT);
  ERROR: [CAST_OVERFLOW] The value 2147483648L of the type "BIGINT" cannot be cast to "INT" due to an overflow.

> SELECT CAST(DATE'2020-01-01' AS INT)
  ERROR: [DATATYPE_MISMATCH.CAST_WITH_FUNC_SUGGESTION] Cannot resolve "CAST(DATE '2020-01-01' AS INT)" due to data type mismatch: cannot cast "DATE" to "INT".

-- `spark.sql.ansi.enabled=false` (This is a default behavior)
> SELECT cast('a' AS INT);
  null

> SELECT CAST(2147483648L AS INT);
  -2147483648

> SELECT CAST(DATE'2020-01-01' AS INT);
  null

Asignación de almacén

El valor spark.sql.storeAssignmentPolicy predeterminado es ANSI. Con esta configuración, cuando los tipos de datos de valores de origen no coinciden con los tipos de columna de destino, Spark SQL agrega automáticamente cláusulas ANSI CAST a la INSERT instrucción . Durante la inserción de tablas en esta directiva, Spark comprueba y rechaza conversiones no válidas, lanzando una excepción para garantizar la calidad de los datos. Esto significa que si se produce un error en un intento de inserción debido a un error de coincidencia de tipos, no se producirá que los datos se escriban parcialmente en la tabla.

Ejemplos:

-- spark.sql.storeAssignmentPolicy=ANSI
> CREATE TABLE test(i INT);
> INSERT INTO test VALUES (2147483648L);
  ERROR: [CAST_OVERFLOW_IN_TABLE_INSERT] Fail to insert a value of "BIGINT" type into the "INT" type column `i` due to an overflow.

> INSERT INTO test VALUES ('a');
  ERROR: [CAST_INVALID_INPUT ERROR] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed

En estos ejemplos se muestra Spark SQL que impide que se inserten datos incompatibles, lo que mantiene la integridad de los datos.

Cuando se establece el spark.sql.storeAssignmentPolicy en LEGACY, Spark SQL revierte al comportamiento frecuente hasta Spark 2.x. En este modo, en lugar de usar ANSI CAST, aplica operaciones CAST heredadas. En esta directiva, las conversiones no válidas durante las inserciones de tabla producen valores NULL o valores incorrectos que se insertan, en lugar de producir una excepción. Ejemplos:

-- spark.sql.storeAssignmentPolicy=LEGACY
> CREATE TABLE test(i INT);
> INSERT INTO test VALUES (2147483648L);
> INSERT INTO test VALUES ('a');
> SELECT * FROM test;

-- Results
--  -2147483648 (incorrect value due to overflow)
--  null (cannot cast 'a' to INT)

Conversión de tipos

Promoción y prioridad de tipos

Cuando spark.sql.ansi.enabled se establece en true, Spark SQL usa varias reglas que rigen cómo se resuelven los conflictos entre tipos de datos. En la base de esta resolución de conflictos se encuentra la lista de prioridad de tipos que define si los valores de un tipo de datos determinado se pueden promover a otro tipo de datos implícitamente.

Tipo de datos Lista de prioridad (de más estrecha a más amplia)
byte Byte -> Short -> Int - Long ->> Decimal -> Float* -> Double
Corto Corto -> Entero -> Largo -> Decimal-> Flotante* -> Doble
Int Int - Long ->> Decimal -> Float* -> Double
long Long - Decimal ->> Float* -> Double
Decimal Decimal -> Float* -> Double
Flotar Flotante -> Doble
Doble Doble
Fecha Fecha -> Marca de tiempo
Marca de tiempo Marca de tiempo
Cuerda Cuerda
Binario Binario
Booleano Booleano
Intervalo Intervalo
Mapa Mapa**
Arreglo Arreglo**
Estructura Estructura**
  • Para una resolución de tipo menos común, float se omite para evitar la pérdida de precisión.

** Para un tipo complejo, la regla de prioridad se aplica de forma recursiva a sus elementos de componente.

Se aplican reglas especiales para el tipo String y el NULL sin tipo. Un valor NULL se puede promover a cualquier otro tipo, mientras que un objeto String se puede promover a cualquier tipo de datos simple.

Esta es una representación gráfica de la lista de prioridad como un árbol dirigido: Representación gráfica de las reglas de prioridad

Resolución de los tipos menos comunes

El tipo menos común de un conjunto de tipos es el tipo más estrecho accesible desde la lista de prioridad por todos los elementos del conjunto de tipos.

La resolución de tipo menos común se utiliza para:

  • Decidir si se puede invocar una función que espera un parámetro de un tipo mediante un argumento de un tipo más estrecho.
  • Derivar el tipo de argumento para funciones que esperan un tipo de argumento compartido para varios parámetros, como coalesce, least o greatest.
  • Derivar los tipos de operando para operadores como operaciones aritméticas o comparaciones.
  • Derivar el tipo de resultado para expresiones como la expresión case.
  • Derivar los tipos de elemento, clave o valor para constructores de matriz y mapa.

Se aplican reglas especiales si el tipo menos común se resuelve como FLOAT. Con los valores de tipo float, si alguno de los tipos es INT, BIGINT o DECIMAL, el tipo menos común se convierte a DOUBLE para evitar la posible pérdida de dígitos.

-- The coalesce function accepts any set of argument types as long as they share a least common type.
-- The result type is the least common type of the arguments.
> SET spark.sql.ansi.enabled=true;

> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT

> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]

> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)));
ARRAY<BIGINT>

> SELECT typeof(coalesce(1, 1F));
DOUBLE

> SELECT typeof(coalesce(1L, 1F));
DOUBLE

> SELECT (typeof(coalesce(1BD, 1F)));
DOUBLE

-- The substring function expects arguments of type INT for the start and length parameters.
> SELECT substring('hello', 1Y, 2);
he

> SELECT substring('hello', '1', 2);
he

> SELECT substring('hello', 1L, 2);
Error: Argument 2 requires an INT type.

> SELECT substring('hello', str, 2) FROM VALUES(CAST('1' AS STRING)) AS T(str);
Error: Argument 2 requires an INT type.

Funciones de SQL

El comportamiento de algunas funciones SQL puede ser diferente en el modo ANSI (spark.sql.ansi.enabled=true).

  • size: esta función devuelve NULL para la entrada NULL en el modo ANSI.
  • element_at:
    • Esta función produce ArrayIndexOutOfBoundsException si se usan índices no válidos.
    • Esta función produce NoSuchElementException si la clave no existe en el mapa.
  • elt: esta función produce ArrayIndexOutOfBoundsException si se usan índices no válidos.
  • make_date: se produce un error en esta función con una excepción si la fecha del resultado no es válida.
  • make_timestamp: se produce un error en esta función con una excepción si la marca de tiempo del resultado no es válida.
  • make_interval: se produce un error en esta función con una excepción si el intervalo del resultado no es válido.
  • next_day: esta función produce IllegalArgumentException si la entrada no es un día de la semana válido.
  • parse_url: esta función produce IllegalArgumentException si una cadena de entrada no es una dirección URL válida.
  • to_date: esta función produce un error con una excepción si no se puede analizar la cadena de entrada o la cadena de patrón no es válida.
  • to_timestamp: esta función produce un error con una excepción si no se puede analizar la cadena de entrada o la cadena de patrón no es válida.
  • to_unix_timestamp: esta función produce un error con una excepción si no se puede analizar la cadena de entrada o la cadena de patrón no es válida.
  • unix_timestamp: esta función produce un error con una excepción si no se puede analizar la cadena de entrada o la cadena de patrón no es válida.

Operadores SQL

El comportamiento de algunos operadores SQL puede ser diferente en el modo ANSI (spark.sql.ansi.enabled=true).

  • array_col[index]: este operador produce ArrayIndexOutOfBoundsException si se usan índices no válidos.
  • map_col[key]: este operador produce NoSuchElementException si la clave no existe en el mapa.
  • CAST(string_col AS TIMESTAMP): Este operador lanza una excepción si no se puede analizar la cadena de entrada.
  • CAST(string_col AS DATE): Este operador lanza una excepción si no se puede analizar la cadena de entrada.

Funciones útiles para el modo ANSI

Cuando el modo ANSI está activado, produce excepciones para operaciones no válidas. Puede usar las siguientes funciones SQL para suprimir tales excepciones.

  • try_cast: idéntica a CAST, salvo que devuelve el resultado NULL en lugar de producir una excepción en el error en tiempo de ejecución.
  • try_add: idéntica al operador de suma +, salvo que devuelve el resultado NULL en lugar de producir una excepción en el desbordamiento de valores enteros.
  • try_divide: idéntica al operador de división /, salvo que devuelve el resultado NULL en lugar de producir una excepción al dividir 0.

Palabras clave de SQL

Cuando spark.sql.ansi.enabled es true, Spark SQL usará el analizador del modo ANSI. En este modo, Spark SQL tiene dos tipos de palabras clave:

  • Palabras clave reservadas: palabras clave reservadas y que no se pueden usar como identificadores para tablas, vistas, columnas, funciones, alias, etc.
  • Palabras clave no reservadas: palabras clave que tienen un significado especial solo en contextos concretos y se pueden usar como identificadores en otros contextos. Por ejemplo, EXPLAIN SELECT ... es un comando, pero EXPLAIN se puede usar como identificador en otros lugares.

Cuando el modo ANSI está deshabilitado, Spark SQL tiene dos tipos de palabras clave:

  • Palabras clave no reservadas: la misma definición que con el modo ANSI habilitado.
  • Palabras clave no reservadas estrictas: una versión estricta de palabras clave no reservadas, que no se pueden usar como aliases de tabla.

De forma predeterminada, spark.sql.ansi.enabled es false.

A continuación se muestra una lista de todas las palabras clave de Spark SQL.

Palabra clave Modo ANSI de Spark SQL Modo predeterminado de Spark SQL SQL-2016
AGREGAR no reservada no reservada no reservada
DESPUÉS no reservada no reservada no reservada
TODOS reservada no reservada reservada
ALTERAR no reservada no reservada reservada
SIEMPRE no reservada no reservada no reservada
ANÁLISIS no reservada no reservada no reservada
y reservada no reservada reservada
ANTI no reservada no reservada estricta no reservada
CUALQUIER reservada no reservada reservada
ARCHIVO no reservada no reservada no reservada
ARREGLO no reservada no reservada reservada
COMO reservada no reservada reservada
ASC no reservada no reservada no reservada
EN no reservada no reservada reservada
AUTORIZACIÓN reservada no reservada reservada
ENTRE no reservada no reservada reservada
AMBOS reservada no reservada reservada
BALDE no reservada no reservada no reservada
CUBOS no reservada no reservada no reservada
POR no reservada no reservada reservada
CACHÉ no reservada no reservada no reservada
CASCADA no reservada no reservada no reservada
CASO reservada no reservada reservada
REPARTO reservada no reservada reservada
CAMBIO no reservada no reservada no reservada
COMPROBAR reservada no reservada reservada
CLARO no reservada no reservada no reservada
Clúster no reservada no reservada no reservada
AGRUPADO no reservada no reservada no reservada
CODEGEN no reservada no reservada no reservada
COTEJAR reservada no reservada reservada
COLECCIÓN no reservada no reservada no reservada
COLUMN reservada no reservada reservada
COLUMNS no reservada no reservada no reservada
COMENTARIO no reservada no reservada no reservada
COMETER no reservada no reservada reservada
COMPACTO no reservada no reservada no reservada
COMPACTACIONES no reservada no reservada no reservada
CALCULAR no reservada no reservada no reservada
CONCATENAR no reservada no reservada no reservada
CONSTRAINT reservada no reservada reservada
COSTO no reservada no reservada no reservada
CREAR reservada no reservada reservada
CRUZ reservada no reservada estricta reservada
CUBO no reservada no reservada reservada
ACTUAL no reservada no reservada reservada
CURRENT_DATE reservada no reservada reservada
Hora actual reservada no reservada reservada
CURRENT_TIMESTAMP reservada no reservada reservada
USUARIO_ACTUAL reservada no reservada reservada
DATOS no reservada no reservada no reservada
BASE DE DATOS no reservada no reservada no reservada
Bases de Datos no reservada no reservada no reservada
DÍA no reservada no reservada no reservada
DBPROPERTIES no reservada no reservada no reservada
DEFINIDO no reservada no reservada no reservada
ELIMINAR no reservada no reservada reservada
DELIMITADO no reservada no reservada no reservada
DESC no reservada no reservada no reservada
DESCRIBIR no reservada no reservada reservada
DFS no reservada no reservada no reservada
DIRECTORIOS no reservada no reservada no reservada
DIRECTORIO no reservada no reservada no reservada
DISTINTO reservada no reservada reservada
DISTRIBUIR no reservada no reservada no reservada
DIV no reservada no reservada no es una palabra clave
SOLTAR no reservada no reservada reservada
MÁS reservada no reservada reservada
FIN reservada no reservada reservada
ESCAPAR reservada no reservada reservada
ESCAPÓ no reservada no reservada no reservada
EXCEPTO reservada no reservada estricta reservada
INTERCAMBIO no reservada no reservada no reservada
EXISTE no reservada no reservada reservada
EXPLAIN no reservada no reservada no reservada
Exportar no reservada no reservada no reservada
EXTENDIDO no reservada no reservada no reservada
EXTERNO no reservada no reservada reservada
EXTRAER no reservada no reservada reservada
FALSO reservada no reservada reservada
RECUPERAR reservada no reservada reservada
CAMPOS no reservada no reservada no reservada
FILTRO reservada no reservada reservada
FORMATO DE ARCHIVO no reservada no reservada no reservada
PRIMERO no reservada no reservada no reservada
FN no reservada no reservada no reservada
SIGUIENDO no reservada no reservada no reservada
PARA reservada no reservada reservada
EXTRANJERO reservada no reservada reservada
FORMATO no reservada no reservada no reservada
FORMATEADO no reservada no reservada no reservada
DE reservada no reservada reservada
LLENO reservada no reservada estricta reservada
FUNCIÓN no reservada no reservada reservada
FUNCIONES no reservada no reservada no reservada
GENERADO no reservada no reservada no reservada
GLOBAL no reservada no reservada reservada
GRANT reservada no reservada reservada
Subvenciones no reservada no reservada no reservada
GRUPO reservada no reservada reservada
AGRUPACIÓN no reservada no reservada reservada
HAVING reservada no reservada reservada
HORA no reservada no reservada no reservada
SI no reservada no reservada no es una palabra clave
IGNORAR no reservada no reservada no reservada
IMPORTACIÓN no reservada no reservada no reservada
EN reservada no reservada reservada
ÍNDICE no reservada no reservada no reservada
ÍNDICES no reservada no reservada no reservada
INTERIOR reservada no reservada estricta reservada
INPATH no reservada no reservada no reservada
FORMATO DE ENTRADA no reservada no reservada no reservada
INSERT no reservada no reservada reservada
INTERSECAR reservada no reservada estricta reservada
INTERVALO no reservada no reservada reservada
EN reservada no reservada reservada
ES reservada no reservada reservada
ARTÍCULOS no reservada no reservada no reservada
JOIN reservada no reservada estricta reservada
JSON no reservada no reservada no reservada
LLAVE no reservada no reservada no reservada
LLAVES no reservada no reservada no reservada
ÚLTIMO no reservada no reservada no reservada
LATERAL reservada no reservada estricta reservada
PEREZOSO no reservada no reservada no reservada
Líder reservada no reservada reservada
Izquierda reservada no reservada estricta reservada
GUSTAR no reservada no reservada reservada
ILIKE no reservada no reservada no reservada
LIMIT no reservada no reservada no reservada
LÍNEAS no reservada no reservada no reservada
LIST no reservada no reservada no reservada
CARGA no reservada no reservada no reservada
LOCAL no reservada no reservada reservada
UBICACIÓN no reservada no reservada no reservada
CERRADURA no reservada no reservada no reservada
CERRADURAS no reservada no reservada no reservada
LÓGICO no reservada no reservada no reservada
Macro no reservada no reservada no reservada
MAPA no reservada no reservada no reservada
EMPAREJADO no reservada no reservada no reservada
Fusionar no reservada no reservada no reservada
MINUTO no reservada no reservada no reservada
MENOS no reservada no reservada estricta no reservada
MES no reservada no reservada no reservada
MSCK no reservada no reservada no reservada
Espacio de nombres no reservada no reservada no reservada
ESPACIOS DE NOMBRES no reservada no reservada no reservada
NATURAL reservada no reservada estricta reservada
NO no reservada no reservada reservada
NO reservada no reservada reservada
NULO reservada no reservada reservada
VALORES NULOS no reservada no reservada no reservada
DE no reservada no reservada reservada
EN reservada no reservada estricta reservada
SOLAMENTE reservada no reservada reservada
OPCIÓN no reservada no reservada no reservada
OPCIONES no reservada no reservada no reservada
O reservada no reservada reservada
PEDIDO reservada no reservada reservada
FUERA no reservada no reservada reservada
EXTERIOR reservada no reservada reservada
FORMATO DE SALIDA no reservada no reservada no reservada
SOBRE no reservada no reservada no reservada
SUPERPOSICIONES reservada no reservada reservada
SUPERPOSICIÓN no reservada no reservada no reservada
SOBRESCRIBIR no reservada no reservada no reservada
PARTITION no reservada no reservada reservada
REPARTIDO no reservada no reservada no reservada
PARTICIONES no reservada no reservada no reservada
PORCENTAJE no reservada no reservada no reservada
PIVOT no reservada no reservada no reservada
COLOCACIÓN no reservada no reservada no reservada
POSICIÓN no reservada no reservada reservada
PRECEDENTE no reservada no reservada no reservada
Primario reservada no reservada reservada
DIRECTORES no reservada no reservada no reservada
PROPIEDADES no reservada no reservada no reservada
Purga no reservada no reservada no reservada
QUALIFY reservada no reservada reservada
CONSULTA no reservada no reservada no reservada
GAMA no reservada no reservada reservada
DESTINATARIO no reservada no reservada no reservada
RECIPIENTS no reservada no reservada no reservada
LECTOR DE REGISTROS no reservada no reservada no reservada
RECORDWRITER no reservada no reservada no reservada
RECUPERAR no reservada no reservada no reservada
REDUCIR no reservada no reservada no reservada
REFERENCIAS reservada no reservada reservada
REFRESH no reservada no reservada no reservada
REGEXP no reservada no reservada no es una palabra clave
REMOVE no reservada no reservada no reservada
RENOMBRAR no reservada no reservada no reservada
REPARACIÓN no reservada no reservada no reservada
REEMPLAZAR no reservada no reservada no reservada
RESET no reservada no reservada no reservada
RESPETO no reservada no reservada no reservada
RESTRINGIR no reservada no reservada no reservada
REVOKE no reservada no reservada reservada
DERECHA reservada no reservada estricta reservada
RLIKE no reservada no reservada no reservada
ROL no reservada no reservada no reservada
PAPELES no reservada no reservada no reservada
REVERSIÓN no reservada no reservada reservada
AGREGACIÓN no reservada no reservada reservada
FILA no reservada no reservada reservada
FILAS no reservada no reservada reservada
SCHEMA no reservada no reservada no reservada
ESQUEMAS no reservada no reservada no es una palabra clave
SEGUNDO no reservada no reservada no reservada
SELECT reservada no reservada reservada
SEMI no reservada no reservada estricta no reservada
SEPARADO no reservada no reservada no reservada
SERDE no reservada no reservada no reservada
SERDEPROPERTIES no reservada no reservada no reservada
SESSION_USER reservada no reservada reservada
SET no reservada no reservada reservada
CONJUNTOS no reservada no reservada no reservada
COMPARTIR no reservada no reservada no reservada
SHARES no reservada no reservada no reservada
MOSTRAR no reservada no reservada no reservada
SESGADA no reservada no reservada no reservada
ALGUNOS reservada no reservada reservada
ORDENAR no reservada no reservada no reservada
ORDENADOS no reservada no reservada no reservada
Inicio no reservada no reservada reservada
ESTADÍSTICAS no reservada no reservada no reservada
ALMACENADO no reservada no reservada no reservada
ESTRATIFICAR no reservada no reservada no reservada
ESTRUCTURA no reservada no reservada no reservada
SUBSTR no reservada no reservada no reservada
SUBCADENA no reservada no reservada no reservada
SYNC no reservada no reservada no reservada
TABLE reservada no reservada reservada
TABLES no reservada no reservada no reservada
TABLESAMPLE no reservada no reservada reservada
TBLPROPERTIES no reservada no reservada no reservada
Temperatura no reservada no reservada no es una palabra clave
TEMPORAL no reservada no reservada no reservada
TERMINADO no reservada no reservada no reservada
ENTONCES reservada no reservada reservada
TIEMPO reservada no reservada reservada
PARA reservada no reservada reservada
TOQUE no reservada no reservada no reservada
REZAGADO reservada no reservada reservada
TRANSACCIÓN no reservada no reservada no reservada
TRANSACCIONES no reservada no reservada no reservada
TRANSFORMAR no reservada no reservada no reservada
RECORTAR no reservada no reservada no reservada
VERDADERO no reservada no reservada reservada
TRUNCAR no reservada no reservada reservada
TRY_CAST no reservada no reservada no reservada
TIPO no reservada no reservada no reservada
Desarchivar no reservada no reservada no reservada
Sin Límites no reservada no reservada no reservada
UNCACHE no reservada no reservada no reservada
UNIÓN reservada no reservada estricta reservada
ÚNICO reservada no reservada reservada
DESCONOCIDO reservada no reservada reservada
DESBLOQUEAR no reservada no reservada no reservada
UNSET no reservada no reservada no reservada
UPDATE no reservada no reservada reservada
USO no reservada no reservada no reservada
USUARIO reservada no reservada reservada
UTILIZANDO reservada no reservada estricta reservada
VALUES no reservada no reservada reservada
VISTA no reservada no reservada no reservada
VIEWS no reservada no reservada no reservada
CUANDO reservada no reservada reservada
WHERE reservada no reservada reservada
WINDOW no reservada no reservada reservada
CON reservada no reservada reservada
AÑO no reservada no reservada no reservada
ZONA no reservada no reservada no reservada