Cumplimiento de ANSI en Databricks Runtime
Se aplica a: 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 sean del estándar ANSI SQL directamente, pero sus comportamientos se alinearán 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 |
false | 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 el uso de las palabras clave reservadas de ANSI SQL como identificadores en el analizador de SQL. |
spark.sql.storeAssignmentPolicy |
ANSI | 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 : con la directiva ANSI, Spark realiza la coerción de tipo 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 o truncamiento de datos en la coerción de tipo, por ejemplo, no se permite convertir "double" a "int" o "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 de 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:
- NumericType <=> BooleanType
- 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 | Numeric | String | Date | Timestamp | Intervalo | Boolean | Binary | Array | Map | Estructura |
---|---|---|---|---|---|---|---|---|---|---|
Numeric | Y | Y | N | N | N | Y | N | N | N | N |
String | Y | Y | Y | Y | Y | Y | Y | N | N | N |
Date | N | Y | Y | Y | N | N | N | N | N | N |
Timestamp | N | Y | Y | Y | N | N | N | N | N | N |
Intervalo | N | Y | N | N | Y | N | N | N | N | N |
Boolean | Y | Y | N | N | N | Y | N | N | N | N |
Binary | Y | N | N | N | N | N | Y | N | N | N |
Array | N | N | N | N | N | N | N | Y | N | N |
Map | N | N | N | N | N | N | N | N | Y | N |
Estructura | N | N | N | N | N | N | N | N | N | Y |
-- 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 instrucción INSERT.
Durante la inserción de tablas en esta directiva, Spark comprueba y rechaza conversiones no válidas, iniciando 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 |
Short | Short -> Int -> Long -> Decimal-> Float* -> Double |
Int | Int -> Long -> Decimal -> Float* -> Double |
long | Long -> Decimal -> Float* -> Double |
Decimal | Decimal -> Float* -> Double |
Float | Float -> Double |
Double | Double |
Date | Date -> Timestamp |
Timestamp | Timestamp |
String | String |
Binary | Binary |
Boolean | Boolean |
Intervalo | Intervalo |
Map | Map** |
Array | Array** |
Estructura | Struct** |
- 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 los valores 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:
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 tipos menos común se usa 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 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 en FLOAT. Con los valores de tipo float, si alguno de los tipos es INT, BIGINT o DECIMAL, el tipo menos común se inserta en 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.
- Esta función produce
elt
: esta función produceArrayIndexOutOfBoundsException
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 produceIllegalArgumentException
si la entrada no es un día de la semana válido.parse_url
: esta función produceIllegalArgumentException
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 la cadena de entrada no se puede analizar o la cadena de patrón no es válida.to_timestamp
: esta función produce un error con una excepción si la cadena de entrada no se puede analizar o la cadena de patrón no es válida.to_unix_timestamp
: esta función produce un error con una excepción si la cadena de entrada no se puede analizar o la cadena de patrón no es válida.unix_timestamp
: esta función produce un error con una excepción si la cadena de entrada no se puede analizar 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 produceArrayIndexOutOfBoundsException
si se usan índices no válidos.map_col[key]
: este operador produceNoSuchElementException
si la clave no existe en el mapa.CAST(string_col AS TIMESTAMP)
: se produce un error en este operador con una excepción si la cadena de entrada no se puede analizar.CAST(string_col AS DATE)
: se produce un error en este operador con una excepción si la cadena de entrada no se puede analizar.
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 aCAST
, salvo que devuelve el resultadoNULL
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 resultadoNULL
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 resultadoNULL
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 que no se pueden usar como identificadores de tabla, vista, columna, función, 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 puede usar como alias 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 |
---|---|---|---|
ADD | no reservada | no reservada | no reservada |
AFTER | no reservada | no reservada | no reservada |
ALL | reservada | no reservada | reservada |
ALTER | no reservada | no reservada | reservada |
ALWAYS | 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 |
ANY | reservada | no reservada | reservada |
ARCHIVE | no reservada | no reservada | no reservada |
ARRAY | no reservada | no reservada | reservada |
AS | reservada | no reservada | reservada |
ASC | no reservada | no reservada | no reservada |
AT | no reservada | no reservada | reservada |
AUTHORIZATION | reservada | no reservada | reservada |
BETWEEN | no reservada | no reservada | reservada |
BOTH | reservada | no reservada | reservada |
BUCKET | no reservada | no reservada | no reservada |
BUCKETS | no reservada | no reservada | no reservada |
BY | no reservada | no reservada | reservada |
CACHE | no reservada | no reservada | no reservada |
CASCADE | no reservada | no reservada | no reservada |
CASE | reservada | no reservada | reservada |
CAST | reservada | no reservada | reservada |
CHANGE | no reservada | no reservada | no reservada |
CHECK | reservada | no reservada | reservada |
CLEAR | no reservada | no reservada | no reservada |
CLUSTER | no reservada | no reservada | no reservada |
CLUSTERED | no reservada | no reservada | no reservada |
CODEGEN | no reservada | no reservada | no reservada |
COLLATE | reservada | no reservada | reservada |
COLLECTION | no reservada | no reservada | no reservada |
COLUMN | reservada | no reservada | reservada |
COLUMNS | no reservada | no reservada | no reservada |
COMMENT | no reservada | no reservada | no reservada |
COMMIT | no reservada | no reservada | reservada |
COMPACT | no reservada | no reservada | no reservada |
COMPACTIONS | no reservada | no reservada | no reservada |
COMPUTE | no reservada | no reservada | no reservada |
CONCATENATE | no reservada | no reservada | no reservada |
CONSTRAINT | reservada | no reservada | reservada |
COST | no reservada | no reservada | no reservada |
CREATE | reservada | no reservada | reservada |
CROSS | reservada | no reservada estricta | reservada |
CUBE | no reservada | no reservada | reservada |
CURRENT | no reservada | no reservada | reservada |
CURRENT_DATE | reservada | no reservada | reservada |
CURRENT_TIME | reservada | no reservada | reservada |
CURRENT_TIMESTAMP | reservada | no reservada | reservada |
CURRENT_USER | reservada | no reservada | reservada |
DATA | no reservada | no reservada | no reservada |
DATABASE | no reservada | no reservada | no reservada |
DATABASES | no reservada | no reservada | no reservada |
DAY | no reservada | no reservada | no reservada |
DBPROPERTIES | no reservada | no reservada | no reservada |
DEFINED | no reservada | no reservada | no reservada |
Delete | no reservada | no reservada | reservada |
DELIMITED | no reservada | no reservada | no reservada |
DESC | no reservada | no reservada | no reservada |
DESCRIBE | no reservada | no reservada | reservada |
DFS | no reservada | no reservada | no reservada |
DIRECTORIES | no reservada | no reservada | no reservada |
DIRECTORY | no reservada | no reservada | no reservada |
DISTINCT | reservada | no reservada | reservada |
DISTRIBUTE | no reservada | no reservada | no reservada |
DIV | no reservada | no reservada | no es una palabra clave |
DROP | no reservada | no reservada | reservada |
ELSE | reservada | no reservada | reservada |
END | reservada | no reservada | reservada |
ESCAPE | reservada | no reservada | reservada |
ESCAPED | no reservada | no reservada | no reservada |
EXCEPT | reservada | no reservada estricta | reservada |
EXCHANGE | no reservada | no reservada | no reservada |
EXISTS | no reservada | no reservada | reservada |
EXPLAIN | no reservada | no reservada | no reservada |
EXPORT | no reservada | no reservada | no reservada |
EXTENDED | no reservada | no reservada | no reservada |
EXTERNAL | no reservada | no reservada | reservada |
EXTRACT | no reservada | no reservada | reservada |
false | reservada | no reservada | reservada |
FETCH | reservada | no reservada | reservada |
FIELDS | no reservada | no reservada | no reservada |
FILTER | reservada | no reservada | reservada |
FILEFORMAT | no reservada | no reservada | no reservada |
FIRST | no reservada | no reservada | no reservada |
FN | no reservada | no reservada | no reservada |
FOLLOWING | no reservada | no reservada | no reservada |
FOR | reservada | no reservada | reservada |
FOREIGN | reservada | no reservada | reservada |
FORMAT | no reservada | no reservada | no reservada |
FORMATTED | no reservada | no reservada | no reservada |
FROM | reservada | no reservada | reservada |
FULL | reservada | no reservada estricta | reservada |
FUNCTION | no reservada | no reservada | reservada |
FUNCTIONS | no reservada | no reservada | no reservada |
GENERATED | no reservada | no reservada | no reservada |
GLOBAL | no reservada | no reservada | reservada |
GRANT | reservada | no reservada | reservada |
GRANTS | no reservada | no reservada | no reservada |
GROUP | reservada | no reservada | reservada |
GROUPING | no reservada | no reservada | reservada |
HAVING | reservada | no reservada | reservada |
HOUR | no reservada | no reservada | no reservada |
IF | no reservada | no reservada | no es una palabra clave |
IGNORE | no reservada | no reservada | no reservada |
IMPORT | no reservada | no reservada | no reservada |
IN | reservada | no reservada | reservada |
INDEX | no reservada | no reservada | no reservada |
INDEXES | no reservada | no reservada | no reservada |
INNER | reservada | no reservada estricta | reservada |
INPATH | no reservada | no reservada | no reservada |
INPUTFORMAT | no reservada | no reservada | no reservada |
INSERT | no reservada | no reservada | reservada |
INTERSECT | reservada | no reservada estricta | reservada |
INTERVAL | no reservada | no reservada | reservada |
INTO | reservada | no reservada | reservada |
IS | reservada | no reservada | reservada |
ITEMS | no reservada | no reservada | no reservada |
JOIN | reservada | no reservada estricta | reservada |
KEY | no reservada | no reservada | no reservada |
KEYS | no reservada | no reservada | no reservada |
LAST | no reservada | no reservada | no reservada |
LATERAL | reservada | no reservada estricta | reservada |
LAZY | no reservada | no reservada | no reservada |
LEADING | reservada | no reservada | reservada |
LEFT | reservada | no reservada estricta | reservada |
LIKE | no reservada | no reservada | reservada |
ILIKE | no reservada | no reservada | no reservada |
LIMIT | no reservada | no reservada | no reservada |
LINES | no reservada | no reservada | no reservada |
LISTA | no reservada | no reservada | no reservada |
LOAD | no reservada | no reservada | no reservada |
LOCAL | no reservada | no reservada | reservada |
LOCATION | no reservada | no reservada | no reservada |
LOCK | no reservada | no reservada | no reservada |
LOCKS | no reservada | no reservada | no reservada |
LOGICAL | no reservada | no reservada | no reservada |
MACRO | no reservada | no reservada | no reservada |
MAP | no reservada | no reservada | no reservada |
MATCHED | no reservada | no reservada | no reservada |
MERGE | no reservada | no reservada | no reservada |
MINUTE | no reservada | no reservada | no reservada |
MINUS | no reservada | no reservada estricta | no reservada |
MONTH | no reservada | no reservada | no reservada |
MSCK | no reservada | no reservada | no reservada |
Espacio de nombres | no reservada | no reservada | no reservada |
NAMESPACES | no reservada | no reservada | no reservada |
NATURAL | reservada | no reservada estricta | reservada |
No | no reservada | no reservada | reservada |
NOT | reservada | no reservada | reservada |
NULL | reservada | no reservada | reservada |
NULLS | no reservada | no reservada | no reservada |
OF | no reservada | no reservada | reservada |
ACTIVAR | reservada | no reservada estricta | reservada |
ONLY | reservada | no reservada | reservada |
OPTION | no reservada | no reservada | no reservada |
OPCIONES | no reservada | no reservada | no reservada |
O BIEN | reservada | no reservada | reservada |
ORDER | reservada | no reservada | reservada |
OUT | no reservada | no reservada | reservada |
OUTER | reservada | no reservada | reservada |
OUTPUTFORMAT | no reservada | no reservada | no reservada |
OVER | no reservada | no reservada | no reservada |
OVERLAPS | reservada | no reservada | reservada |
OVERLAY | no reservada | no reservada | no reservada |
OVERWRITE | no reservada | no reservada | no reservada |
PARTITION | no reservada | no reservada | reservada |
PARTITIONED | no reservada | no reservada | no reservada |
PARTITIONS | no reservada | no reservada | no reservada |
PERCENT | no reservada | no reservada | no reservada |
PIVOT | no reservada | no reservada | no reservada |
PLACING | no reservada | no reservada | no reservada |
POSITION | no reservada | no reservada | reservada |
PRECEDING | no reservada | no reservada | no reservada |
PRIMARY | reservada | no reservada | reservada |
PRINCIPALS | no reservada | no reservada | no reservada |
PROPERTIES | no reservada | no reservada | no reservada |
PURGE | no reservada | no reservada | no reservada |
QUALIFY | reservada | no reservada | reservada |
QUERY | no reservada | no reservada | no reservada |
RANGE | no reservada | no reservada | reservada |
RECIPIENT | no reservada | no reservada | no reservada |
RECIPIENTS | no reservada | no reservada | no reservada |
RECORDREADER | no reservada | no reservada | no reservada |
RECORDWRITER | no reservada | no reservada | no reservada |
RECOVER | no reservada | no reservada | no reservada |
REDUCE | no reservada | no reservada | no reservada |
REFERENCES | 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 |
RENAME | no reservada | no reservada | no reservada |
REPAIR | no reservada | no reservada | no reservada |
REPLACE | no reservada | no reservada | no reservada |
RESET | no reservada | no reservada | no reservada |
RESPECT | no reservada | no reservada | no reservada |
RESTRICT | no reservada | no reservada | no reservada |
REVOKE | no reservada | no reservada | reservada |
RIGHT | reservada | no reservada estricta | reservada |
RLIKE | no reservada | no reservada | no reservada |
ROLE | no reservada | no reservada | no reservada |
ROLES | no reservada | no reservada | no reservada |
ROLLBACK | no reservada | no reservada | reservada |
ROLLUP | no reservada | no reservada | reservada |
ROW | no reservada | no reservada | reservada |
ROWS | no reservada | no reservada | reservada |
SCHEMA | no reservada | no reservada | no reservada |
SCHEMAS | no reservada | no reservada | no es una palabra clave |
SECOND | no reservada | no reservada | no reservada |
SELECT | reservada | no reservada | reservada |
SEMI | no reservada | no reservada estricta | no reservada |
SEPARATED | 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 |
SETS | no reservada | no reservada | no reservada |
SHARE | no reservada | no reservada | no reservada |
SHARES | no reservada | no reservada | no reservada |
SHOW | no reservada | no reservada | no reservada |
SKEWED | no reservada | no reservada | no reservada |
SOME | reservada | no reservada | reservada |
SORT | no reservada | no reservada | no reservada |
SORTED | no reservada | no reservada | no reservada |
START | no reservada | no reservada | reservada |
STATISTICS | no reservada | no reservada | no reservada |
STORED | no reservada | no reservada | no reservada |
STRATIFY | no reservada | no reservada | no reservada |
STRUCT | no reservada | no reservada | no reservada |
SUBSTR | no reservada | no reservada | no reservada |
SUBSTRING | no reservada | no reservada | no reservada |
SINCRONIZAR | 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 |
TEMP | no reservada | no reservada | no es una palabra clave |
TEMPORARY | no reservada | no reservada | no reservada |
TERMINATED | no reservada | no reservada | no reservada |
THEN | reservada | no reservada | reservada |
TIME | reservada | no reservada | reservada |
TO | reservada | no reservada | reservada |
TOUCH | no reservada | no reservada | no reservada |
TRAILING | reservada | no reservada | reservada |
TRANSACTION | no reservada | no reservada | no reservada |
TRANSACTIONS | no reservada | no reservada | no reservada |
TRANSFORM | no reservada | no reservada | no reservada |
TRIM | no reservada | no reservada | no reservada |
TRUE | no reservada | no reservada | reservada |
TRUNCATE | no reservada | no reservada | reservada |
TRY_CAST | no reservada | no reservada | no reservada |
TYPE | no reservada | no reservada | no reservada |
UNARCHIVE | no reservada | no reservada | no reservada |
UNBOUNDED | no reservada | no reservada | no reservada |
UNCACHE | no reservada | no reservada | no reservada |
UNION | reservada | no reservada estricta | reservada |
UNIQUE | reservada | no reservada | reservada |
DESCONOCIDO | reservada | no reservada | reservada |
UNLOCK | no reservada | no reservada | no reservada |
UNSET | no reservada | no reservada | no reservada |
UPDATE | no reservada | no reservada | reservada |
USE | no reservada | no reservada | no reservada |
USER | reservada | no reservada | reservada |
USING | reservada | no reservada estricta | reservada |
VALUES | no reservada | no reservada | reservada |
VIEW | no reservada | no reservada | no reservada |
VIEWS | no reservada | no reservada | no reservada |
WHEN | reservada | no reservada | reservada |
WHERE | reservada | no reservada | reservada |
WINDOW | no reservada | no reservada | reservada |
WITH | reservada | no reservada | reservada |
YEAR | no reservada | no reservada | no reservada |
ZONE | no reservada | no reservada | no reservada |