Partager via


Conformité ANSI dans Databricks Runtime

S’applique à : oui coché Databricks Runtime

Cet article décrit la conformité ANSI dans Databricks Runtime. Pour le mode ANSI dans Databricks SQL, consultez ANSI_MODE.

Spark SQL dispose de deux options pour prendre en charge la conformité avec ANSI SQL : spark.sql.ansi.enabled et spark.sql.storeAssignmentPolicy.

Quand spark.sql.ansi.enabled est défini sur true, Spark SQL utilise un dialecte conforme à ANSI plutôt qu’à Hive. Par exemple, Spark lèvera une exception au moment de l’exécution au lieu de retourner des résultats null si les entrées d’un opérateur ou d’une fonction SQL ne sont pas valides. Certaines caractéristiques du dialecte ANSI ne sont pas directement issues de la norme ANSI SQL, mais leurs comportements s’alignent sur le style d’ANSI SQL.

De plus, Spark SQL offre une option indépendante pour contrôler les comportements de conversion implicite lors du stockage de lignes dans une table. Les comportements de conversion sont définis comme des règles d’affectation de magasin dans la norme.

Quand spark.sql.storeAssignmentPolicy est défini sur ANSI, Spark SQL est conforme aux règles d’affectation de magasin ANSI. Il s’agit d’une configuration distincte, car sa valeur par défaut est ANSI, tandis que la configuration spark.sql.ansi.enabled est désactivée par défaut.

Le tableau suivant récapitule ce comportement :

Nom de la propriété Default Signification
spark.sql.ansi.enabled false Si la valeur est true, Spark tente de se conformer à la spécification ANSI SQL :

- Lève une exception d’exécution si un dépassement de capacité se produit dans une opération sur un champ entier ou décimal.
- Interdit l’utilisation des mots clés réservés d’ANSI SQL comme identificateurs dans l’analyseur SQL.
spark.sql.storeAssignmentPolicy ANSI Lors du stockage d’une valeur dans une colonne d’un type de données différent, Spark effectue une conversion de type. Il existe trois stratégies pour les règles de forçage de type : ANSI, legacy et strict.

- ANSI : Spark effectue un forçage de type conformément à ANSI SQL. Dans la pratique, le comportement est essentiellement le même que celui de PostgreSQL. Il interdit certaines conversions de type déraisonnable, telles que la conversion d’une chaîne en entier ou d’une valeur double en valeur booléenne.
- legacy : Spark autorise le forçage de type tant qu’il s’agit d’une conversion valide, ce qui est très vague. Par exemple, la conversion d’une chaîne en entier ou d’une valeur double en valeur booléenne est autorisée. Il s’agit également du seul comportement dans Spark 2.x et il est compatible avec Hive.
- strict : Spark n’autorise aucune perte de précision ou troncation de données dans le forçage de type ; ainsi, la conversion de valeur double en entier ou de valeur décimale en valeur double n’est pas autorisée.

Les sous-sections suivantes présentent des changements de comportement dans les opérations arithmétiques, les conversions de types et l’analyse des SQL lorsque le mode ANSI est activé. En ce qui concerne les conversions de types dans Spark SQL, il en existe de trois sortes que cet article présente : cast, affectation de magasin et forçage de type.

Opérations arithmétiques

Dans Spark SQL, les opérations arithmétiques effectuées sur des types numériques (à l’exception du type décimal) ne sont pas vérifiées par défaut sur le plan des dépassements. Cela signifie que, si une opération provoque des dépassements, le résultat est le même avec l’opération correspondante dans un programme Java ou Scala (par exemple, si la somme de 2 entiers est supérieure à la valeur maximale pouvant être représentée, le résultat est un nombre négatif). Par ailleurs, Spark SQL retourne la valeur null pour les dépassements décimaux. Lorsque spark.sql.ansi.enabled est défini sur true et qu’un dépassement se produit dans des opérations arithmétiques numériques et d’intervalle, celui-ci lève une exception arithmétique au moment de l’exécution.

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

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

Caster

Lorsque spark.sql.ansi.enabled est défini sur true, un cast explicite à l’aide de la syntaxe CAST lève une exception de runtime pour les modèles de cast non autorisés définis dans la norme, tels des casts de chaîne en entier.

La clause CAST du mode ANSI Spark suit les règles de syntaxe de la section 6.13 « cast specification » de la spécification ISO/IEC 9075-2:2011 Information technology — Database languages - SQL — Part 2: Foundation (SQL/Foundation), sauf qu’elle autorise spécialement les conversions de types directes suivantes, que la norme ANSI n’autorise pas :

  • NumericType <=> BooleanType
  • StringType <=> BinaryType

Les combinaisons valides de types de données source et cible dans une expression CAST sont présentées dans le tableau suivant. « O » indique que la combinaison est syntaxiquement valide sans restriction, et « N » qu’elle ne l’est pas.

SourceTarget Numérique String Date Timestamp Intervalle Boolean Binary Array Mappage Struct
Numérique O O N N N Y N N N N
String O O O O O O O N N N
Date N O O O N N N N N N
Timestamp N O O O N N N N N N
Intervalle N Y N N Y N N N N N
Boolean O O N N N Y N N N N
Binary O N N N N N Y N N N
Array N N N N N N N Y N N
Mappage N N N N N N N N Y N
Struct N N N N N N N N N O
-- 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

Affectation de magasin

Le paramètre spark.sql.storeAssignmentPolicy par défaut est ANSI. Avec ce paramètre, lorsque les types de données des valeurs sources ne correspondent pas aux types de colonnes cibles, Spark SQL ajoute automatiquement des clauses ANSI CAST à l’instruction INSERT. Lors de l’insertion d’une table dans le cadre de cette stratégie, Spark vérifie et rejette les casts invalides, en levant une exception pour garantir la qualité des données. Cela signifie que si une tentative d’insertion échoue en raison d’une incompatibilité de type, aucune donnée n’est partiellement écrite dans la table.

Exemples :

-- 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

Ces exemples montrent que Spark SQL empêche l’insertion de données incompatibles, ce qui maintient l’intégrité des données.

Lorsque le spark.sql.storeAssignmentPolicy est défini sur LEGACY, Spark SQL rétablit le comportement répandu jusqu’à Spark 2.x. Dans ce mode, au lieu d’utiliser ANSI CAST, il applique des opérations CAST héritées. Dans cette stratégie, les casts non valides pendant les insertions de table entraînent l’insertion de valeurs NULL ou de valeurs incorrectes au lieu de lever une exception. Exemples :

-- 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)

Forçage de type

Promotion et priorité de type

Lorsque spark.sql.ansi.enabled est défini sur true, Spark SQL utilise plusieurs règles qui régissent le mode de résolution des conflits entre les types de données. Au cœur de cette résolution des conflits se trouve la liste des priorités des types qui définit si les valeurs d’un type de données peuvent être promues de manière implicite vers un autre type de données.

Type de données Liste des priorités (du plus étroit au plus large)
Byte Byte -> Short -> Int -> Long -> Decimal -> Float* -> Double
Court 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
Intervalle Intervalle
Mappage Map**
Array Array**
Struct Struct**
  • Pour la résolution du type le moins courant, le type float est ignoré pour éviter la perte de précision.

** Pour un type complexe, la règle de priorité s’applique de manière récursive à ses éléments constitutifs.

Des règles spéciales s’appliquent au type chaîne (String) et aux valeurs NULL non typées. Une valeur NULL peut être promue vers n’importe quel autre type, tandis qu’une chaîne peut être promue vers tout type de données simple.

Voici une représentation graphique de la liste des priorités sous la forme d’une arborescence dirigée: Représentation graphique des règles de priorité

Résolution du type le moins courant

Le type le moins courant d’un ensemble de types est le type le plus étroit accessible à partir de la liste des priorités par tous les éléments de l’ensemble de types.

La résolution du type le moins courant est utilisée pour :

  • Décider si une fonction qui attend un paramètre d’un type donné peut être appelée à l’aide d’un argument d’un type plus étroit.
  • Déduire le type d’argument pour des fonctions qui attendent un type d’argument partagé pour plusieurs paramètres, tels que coalesce, least ou greatest.
  • Déduire les types d’opérandes pour des opérateurs tels que des opérations arithmétiques ou des comparaisons.
  • Déterminer le type de résultat pour des expressions telles que l’expression case.
  • Déduire les types d’élément, de clé ou de valeur pour des constructeurs de tableau et de mappage.

Des règles spéciales sont appliquées si le type le moins courant se résout en FLOAT. Avec des valeurs de type float, si l’un des types est INT, BIGINT ou DECIMAL, le type le moins courant est poussé vers le type DOUBLE pour éviter toute perte potentielle de chiffres.

-- 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.

Fonctions SQL

Le comportement de certaines fonctions SQL peut différer en mode ANSI (spark.sql.ansi.enabled=true).

  • size : cette fonction retourne null pour une entrée null en mode ANSI.
  • element_at:
    • Cette fonction lève une exception ArrayIndexOutOfBoundsException en cas d’utilisation d’index non valides.
    • Cette fonction lève une exception NoSuchElementException si la clé n’existe pas dans le mappage.
  • elt : cette fonction lève une exception ArrayIndexOutOfBoundsException en cas d’utilisation d’index non valides.
  • make_date : cette fonction échoue avec une exception si la date du résultat n’est pas valide.
  • make_timestamp : cette fonction échoue avec une exception si le timestamp du résultat n’est pas valide.
  • make_interval : cette fonction échoue avec une exception si l’intervalle du résultat n’est pas valide.
  • next_day : cette fonction lève une exception IllegalArgumentException si l’entrée n’est pas un jour de la semaine valide.
  • parse_url : cette fonction lève une exception IllegalArgumentException si une chaîne d’entrée n’est pas une URL valide.
  • to_date : cette fonction échoue avec une exception si la chaîne d’entrée ne peut pas être analysée ou si la chaîne de modèle n’est pas valide.
  • to_timestamp : cette fonction échoue avec une exception si la chaîne d’entrée ne peut pas être analysée ou si la chaîne de modèle n’est pas valide.
  • to_unix_timestamp : cette fonction échoue avec une exception si la chaîne d’entrée ne peut pas être analysée ou si la chaîne de modèle n’est pas valide.
  • unix_timestamp : cette fonction échoue avec une exception si la chaîne d’entrée ne peut pas être analysée ou si la chaîne de modèle n’est pas valide.

Opérateurs SQL

Le comportement de certains opérateurs SQL peut différer en mode ANSI (spark.sql.ansi.enabled=true).

  • array_col[index] : cet opérateur lève une exception ArrayIndexOutOfBoundsException en cas d’utilisation d’index non valides.
  • map_col[key] : cet opérateur lève une exception NoSuchElementException si la clé n’existe pas dans le mappage.
  • CAST(string_col AS TIMESTAMP) : cet opérateur échoue avec une exception si la chaîne d’entrée ne peut pas être analysée.
  • CAST(string_col AS DATE) : cet opérateur échoue avec une exception si la chaîne d’entrée ne peut pas être analysée.

Fonctions utiles pour le mode ANSI

Lorsque le mode ANSI est activé, il lève des exceptions pour les opérations non valides. Vous pouvez utiliser les fonctions SQL suivantes pour supprimer de telles exceptions.

  • try_cast : fonction identique à CAST, sauf qu’elle retourne le résultat NULL au lieu de lever une exception sur une erreur de runtime.
  • try_add : fonction identique à l’opérateur d’ajout +, sauf qu’elle retourne le résultat NULL au lieu de lever une exception sur un dépassement de valeur intégrale.
  • try_divide : fonction identique à l’opérateur de division /, sauf qu’elle retourne le résultat NULL au lieu de lever une exception sur une division de 0.

Mots clés SQL

Lorsque spark.sql.ansi.enabled a la valeur true, Spark SQL utilise l’analyseur en mode ANSI. Dans ce mode, Spark SQL possède deux types de mots clés :

  • Mots clés réservés : ne peuvent pas être utilisés en tant qu’identificateurs pour une table, un affichage, une colonne, une fonction, un alias, etc.
  • Mots clés non réservés : ont une signification spéciale uniquement dans des contextes particuliers, et peuvent être utilisés comme identificateurs dans d’autres contextes. Par exemple, EXPLAIN SELECT ... est une commande, mais EXPLAIN peut être utilisé comme identificateur dans d’autres emplacements.

Lorsque le mode ANSI est désactivé, Spark SQL possède deux types de mots clés :

  • Mots clés non réservés : même définition que lorsque le mode ANSI est activé.
  • Mots clés non réservés stricts : version stricte des mots clés non réservés, qui ne peut pas être utilisée en tant qu’alias de table.

Par défaut, spark.sql.ansi.enabled a la valeur false.

Vous trouverez ci-dessous une liste de tous les mots clés dans Spark SQL.

Mot clé Mode ANSI de Spark SQL Mode par défaut de Spark SQL SQL-2016
ADD non réservé non réservé non réservé
AFTER non réservé non réservé non réservé
ALL réservé non réservé réservé
ALTER non réservé non réservé réservé
ALWAYS non réservé non réservé non réservé
ANALYSE non réservé non réservé non réservé
AND réservé non réservé réservé
ANTI non réservé non réservé strict non réservé
ANY réservé non réservé réservé
ARCHIVE non réservé non réservé non réservé
ARRAY non réservé non réservé réservé
AS réservé non réservé réservé
ASC non réservé non réservé non réservé
AT non réservé non réservé réservé
AUTHORIZATION réservé non réservé réservé
BETWEEN non réservé non réservé réservé
BOTH réservé non réservé réservé
BUCKET non réservé non réservé non réservé
BUCKETS non réservé non réservé non réservé
BY non réservé non réservé réservé
CACHE non réservé non réservé non réservé
CASCADE non réservé non réservé non réservé
CASE réservé non réservé réservé
CAST réservé non réservé réservé
MODIFIER non réservé non réservé non réservé
CHECK réservé non réservé réservé
CLEAR non réservé non réservé non réservé
CLUSTER non réservé non réservé non réservé
CLUSTERED non réservé non réservé non réservé
CODEGEN non réservé non réservé non réservé
COLLATE réservé non réservé réservé
COLLECTION non réservé non réservé non réservé
COLUMN réservé non réservé réservé
COLUMNS non réservé non réservé non réservé
COMMENTAIRE non réservé non réservé non réservé
COMMIT non réservé non réservé réservé
COMPACT non réservé non réservé non réservé
COMPACTIONS non réservé non réservé non réservé
COMPUTE non réservé non réservé non réservé
CONCATENATE non réservé non réservé non réservé
CONSTRAINT réservé non réservé réservé
COST non réservé non réservé non réservé
CREATE réservé non réservé réservé
CROSS réservé non réservé strict réservé
CUBE non réservé non réservé réservé
CURRENT non réservé non réservé réservé
CURRENT_DATE réservé non réservé réservé
CURRENT_TIME réservé non réservé réservé
CURRENT_TIMESTAMP réservé non réservé réservé
CURRENT_USER réservé non réservé réservé
DATA non réservé non réservé non réservé
DATABASE non réservé non réservé non réservé
DATABASES non réservé non réservé non réservé
DAY non réservé non réservé non réservé
DBPROPERTIES non réservé non réservé non réservé
DEFINED non réservé non réservé non réservé
Suppression non réservé non réservé réservé
DELIMITED non réservé non réservé non réservé
DESC non réservé non réservé non réservé
DESCRIBE non réservé non réservé réservé
DFS non réservé non réservé non réservé
DIRECTORIES non réservé non réservé non réservé
DIRECTORY non réservé non réservé non réservé
DISTINCT réservé non réservé réservé
DISTRIBUTE non réservé non réservé non réservé
DIV non réservé non réservé pas un mot clé
DROP non réservé non réservé réservé
ELSE réservé non réservé réservé
END réservé non réservé réservé
ESCAPE réservé non réservé réservé
ESCAPED non réservé non réservé non réservé
EXCEPT réservé non réservé strict réservé
EXCHANGE non réservé non réservé non réservé
EXISTS non réservé non réservé réservé
EXPLAIN non réservé non réservé non réservé
EXPORT non réservé non réservé non réservé
EXTENDED non réservé non réservé non réservé
EXTERNAL non réservé non réservé réservé
EXTRACT non réservé non réservé réservé
false réservé non réservé réservé
FETCH réservé non réservé réservé
FIELDS non réservé non réservé non réservé
FILTER réservé non réservé réservé
FILEFORMAT non réservé non réservé non réservé
FIRST non réservé non réservé non réservé
FN non réservé non réservé non réservé
FOLLOWING non réservé non réservé non réservé
FOR réservé non réservé réservé
FOREIGN réservé non réservé réservé
FORMAT non réservé non réservé non réservé
FORMATTED non réservé non réservé non réservé
FROM réservé non réservé réservé
FULL réservé non réservé strict réservé
FUNCTION non réservé non réservé réservé
FONCTIONS non réservé non réservé non réservé
GÉNÉRÉ non réservé non réservé non réservé
GLOBAL non réservé non réservé réservé
GRANT réservé non réservé réservé
GRANTS non réservé non réservé non réservé
GROUP réservé non réservé réservé
GROUPING non réservé non réservé réservé
HAVING réservé non réservé réservé
HOUR non réservé non réservé non réservé
IF non réservé non réservé pas un mot clé
IGNORE non réservé non réservé non réservé
IMPORT non réservé non réservé non réservé
IN réservé non réservé réservé
INDEX non réservé non réservé non réservé
INDEXES non réservé non réservé non réservé
INNER réservé non réservé strict réservé
INPATH non réservé non réservé non réservé
INPUTFORMAT non réservé non réservé non réservé
INSERT non réservé non réservé réservé
INTERSECT réservé non réservé strict réservé
INTERVAL non réservé non réservé réservé
INTO réservé non réservé réservé
IS réservé non réservé réservé
ÉLÉMENTS non réservé non réservé non réservé
JOIN réservé non réservé strict réservé
KEY non réservé non réservé non réservé
KEYS non réservé non réservé non réservé
LAST non réservé non réservé non réservé
LATERAL réservé non réservé strict réservé
LAZY non réservé non réservé non réservé
LEADING réservé non réservé réservé
LEFT réservé non réservé strict réservé
LIKE non réservé non réservé réservé
ILIKE non réservé non réservé non réservé
LIMIT non réservé non réservé non réservé
LINES non réservé non réservé non réservé
Liste non réservé non réservé non réservé
LOAD non réservé non réservé non réservé
LOCAL non réservé non réservé réservé
LOCATION non réservé non réservé non réservé
LOCK non réservé non réservé non réservé
LOCKS non réservé non réservé non réservé
LOGICAL non réservé non réservé non réservé
MACRO non réservé non réservé non réservé
MAP non réservé non réservé non réservé
MATCHED non réservé non réservé non réservé
MERGE non réservé non réservé non réservé
MINUTE non réservé non réservé non réservé
MINUS non réservé non réservé strict non réservé
MONTH non réservé non réservé non réservé
MSCK non réservé non réservé non réservé
ESPACE DE NOMS non réservé non réservé non réservé
ESPACES DE NOMS non réservé non réservé non réservé
NATURAL réservé non réservé strict réservé
Non non réservé non réservé réservé
NOT réservé non réservé réservé
NULL réservé non réservé réservé
NULLS non réservé non réservé non réservé
OF non réservé non réservé réservé
ACTIVÉ réservé non réservé strict réservé
ONLY réservé non réservé réservé
OPTION non réservé non réservé non réservé
OPTIONS non réservé non réservé non réservé
OR réservé non réservé réservé
ORDER réservé non réservé réservé
OUT non réservé non réservé réservé
OUTER réservé non réservé réservé
OUTPUTFORMAT non réservé non réservé non réservé
OVER non réservé non réservé non réservé
OVERLAPS réservé non réservé réservé
OVERLAY non réservé non réservé non réservé
OVERWRITE non réservé non réservé non réservé
PARTITION non réservé non réservé réservé
PARTITIONNÉ non réservé non réservé non réservé
PARTITIONS non réservé non réservé non réservé
PERCENT non réservé non réservé non réservé
PIVOT non réservé non réservé non réservé
PLACING non réservé non réservé non réservé
POSITION non réservé non réservé réservé
PRECEDING non réservé non réservé non réservé
PRIMARY réservé non réservé réservé
PRINCIPALS non réservé non réservé non réservé
PROPERTIES non réservé non réservé non réservé
PURGE non réservé non réservé non réservé
QUALIFY réservé non réservé réservé
QUERY non réservé non réservé non réservé
RANGE non réservé non réservé réservé
RECIPIENT non réservé non réservé non réservé
RECIPIENTS non réservé non réservé non réservé
RECORDREADER non réservé non réservé non réservé
RECORDWRITER non réservé non réservé non réservé
RECOVER non réservé non réservé non réservé
REDUCE non réservé non réservé non réservé
REFERENCES réservé non réservé réservé
REFRESH non réservé non réservé non réservé
REGEXP non réservé non réservé pas un mot clé
REMOVE non réservé non réservé non réservé
RENAME non réservé non réservé non réservé
RÉPARER non réservé non réservé non réservé
REPLACE non réservé non réservé non réservé
RESET non réservé non réservé non réservé
RESPECT non réservé non réservé non réservé
RESTRICT non réservé non réservé non réservé
REVOKE non réservé non réservé réservé
RIGHT réservé non réservé strict réservé
RLIKE non réservé non réservé non réservé
ROLE non réservé non réservé non réservé
ROLES non réservé non réservé non réservé
ROLLBACK non réservé non réservé réservé
ROLLUP non réservé non réservé réservé
ROW non réservé non réservé réservé
ROWS non réservé non réservé réservé
SCHEMA non réservé non réservé non réservé
SCHEMAS non réservé non réservé pas un mot clé
SECOND non réservé non réservé non réservé
SELECT réservé non réservé réservé
SEMI non réservé non réservé strict non réservé
SEPARATED non réservé non réservé non réservé
SERDE non réservé non réservé non réservé
SERDEPROPERTIES non réservé non réservé non réservé
SESSION_USER réservé non réservé réservé
SET non réservé non réservé réservé
SETS non réservé non réservé non réservé
PARTAGER non réservé non réservé non réservé
SHARES non réservé non réservé non réservé
SHOW non réservé non réservé non réservé
SKEWED non réservé non réservé non réservé
SOME réservé non réservé réservé
SORT non réservé non réservé non réservé
SORTED non réservé non réservé non réservé
START non réservé non réservé réservé
STATISTICS non réservé non réservé non réservé
STORED non réservé non réservé non réservé
STRATIFY non réservé non réservé non réservé
STRUCT non réservé non réservé non réservé
SUBSTR non réservé non réservé non réservé
SUBSTRING non réservé non réservé non réservé
SYNC non réservé non réservé non réservé
TABLE réservé non réservé réservé
TABLES non réservé non réservé non réservé
TABLESAMPLE non réservé non réservé réservé
TBLPROPERTIES non réservé non réservé non réservé
TEMP non réservé non réservé pas un mot clé
TEMPORARY non réservé non réservé non réservé
TERMINÉ non réservé non réservé non réservé
THEN réservé non réservé réservé
TEMPS réservé non réservé réservé
TO réservé non réservé réservé
TOUCH non réservé non réservé non réservé
TRAILING réservé non réservé réservé
TRANSACTION non réservé non réservé non réservé
TRANSACTIONS non réservé non réservé non réservé
TRANSFORM non réservé non réservé non réservé
TRIM non réservé non réservé non réservé
true non réservé non réservé réservé
TRUNCATE non réservé non réservé réservé
TRY_CAST non réservé non réservé non réservé
TYPE non réservé non réservé non réservé
UNARCHIVE non réservé non réservé non réservé
UNBOUNDED non réservé non réservé non réservé
UNCACHE non réservé non réservé non réservé
UNION réservé non réservé strict réservé
UNIQUE réservé non réservé réservé
UNKNOWN réservé non réservé réservé
UNLOCK non réservé non réservé non réservé
UNSET non réservé non réservé non réservé
UPDATE non réservé non réservé réservé
USE non réservé non réservé non réservé
Utilisateur réservé non réservé réservé
USING réservé non réservé strict réservé
VALUES non réservé non réservé réservé
VIEW non réservé non réservé non réservé
VIEWS non réservé non réservé non réservé
WHEN réservé non réservé réservé
WHERE réservé non réservé réservé
WINDOW non réservé non réservé réservé
WITH réservé non réservé réservé
YEAR non réservé non réservé non réservé
ZONE non réservé non réservé non réservé