Databricks Runtime での ANSI 準拠

適用対象:check marked yes Databricks Runtime

この記事では、Databricks Runtime での ANSI 準拠について説明します。 Databricks SQL の ANSI モードについては、「ANSI_MODE」を参照してください。

Spark SQL には、ANSI SQL 標準への準拠をサポートするために、spark.sql.ansi.enabledspark.sql.storeAssignmentPolicy の 2 つのオプションがあります。

spark.sql.ansi.enabledtrue に設定されている場合、Spark SQL は、Hive 準拠するのではなく、ANSI 準拠の言語を使用します。 たとえば、SQL の演算子/関数への入力が無効である場合、Spark は、null の結果を返すのではなく、実行時に例外をスローします。 ANSI 言語機能の中には、ANSI SQL 標準に直接は由来しないものもありますが、その動作は ANSI SQL のスタイルに合わせて調整されます。

さらに、Spark SQL にはテーブルに行を格納するときに、暗黙的なキャストの動作を制御する独自のオプションがあります。 キャスト動作は、標準のストア割り当てルールとして定義されています。

spark.sql.storeAssignmentPolicyANSI に設定されている場合、Spark SQL は ANSI ストアの割り当て規則に準拠します。 既定値は ANSI でも、構成 spark.sql.ansi.enabled は既定で無効になっているため、これは個別の構成です。

次の表は、この動作をまとめたものです。

プロパティ名 Default 意味
spark.sql.ansi.enabled false true の場合、Spark は ANSI SQL 仕様に準拠しようとします。

* 整数または 10 進数フィールドの演算でオーバーフローが発生した場合に、ランタイム例外をスローします。
* SQL パーサーの識別子として、ANSI SQL の予約済みキーワードを使用することは禁止されています。
spark.sql.storeAssignmentPolicy ANSI データ型が異なる列に値を格納すると、Spark は型変換を実行します。 強制型変換規則には、ANSIlegacystrict の 3 つのポリシーがあります。

* ANSI: Spark では、ANSI SQL に従って強制型変換が実行されます。 実際には、この動作は PostgreSQL とほぼ同じです。 文字列を int に変換する、または double を boolean に変換するなど、特定の不適切な型変換を許可しません。
* legacy: Spark では、有効なキャストである限り、強制型変換が許可されます。これは厳密なものではありません。 たとえば、文字列を int または double を boolean に変換することができます。 また、これは Spark 2.x の唯一の動作であり、Hive と互換性があります。
* strict: Spark では、強制型変換で有効桁数の損失やデータの切り詰めを行うことはできません。たとえば、double から int または decimal から double への変換は許可されていません。

次のサブセクションでは、ANSI モードが有効になっている場合の、算術演算、型変換、SQL 解析での動作の変更について説明します。 Spark SQL での型変換では、キャスト、ストアの割り当て、強制型変換の 3 つの種類があり、この記事ではこれらを 1 つずつ説明します。

算術演算

Spark SQL では、数値型に対して実行される算術演算 (decimal を除く) は、既定でオーバーフローに対してチェックされません。 つまり、演算によってオーバーフローが発生した場合、結果は Java または Scala プログラムの対応する操作と同じになります (たとえば、2 つの整数の合計が表現可能な最大値よりも大きい場合、結果は負の数になります)。 一方、Spark SQL は、10 進数オーバーフローに対して null を返します。 spark.sql.ansi.enabledtrue に設定され、数値とサイクル間隔の算術演算でオーバーフローが発生した場合、実行時に算術例外がスローされます。

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

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

キャスト

spark.sql.ansi.enabledtrue に設定されている場合、CAST 構文による明示的なキャストは、文字列から整数へのキャストなど、標準で定義されている無効なキャスト パターンに対してランタイム例外をスローします。

Spark ANSI モードの CAST 句は、ISO/IEC 9075-2:2011 Information technology — Database languages - SQL — Part 2: Foundation (SQL/Foundation) のセクション 6.13 のキャスト仕様に関する説明で示されている構文規則に従います。ただし、ANSI 標準では許可されていない、次の単純な型変換は許可されている点を除きます。

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

CAST 式のソースとターゲットのデータ型の有効な組み合わせは、次の表に示されています。 "Y" は、組み合わせが制限なく構文的に有効であることを示します。"N" は、その組み合わせが無効であることを示します。

SourceTarget 数値 string Date Timestamp Interval Boolean Binary Array マップ 構造体
数値 Y N N N N N N N
string Y N N N
Date N Y N N N N N N
Timestamp N Y N N N N N N
Interval N N N N N N N N
Boolean Y N N N N N N N
Binary Y N N N N N N N N
Array N N N N N N N N N
マップ N N N N N N N N N
構造体 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

ストアの割り当て

spark.sql.storeAssignmentPolicy 設定の既定値は ANSI です。 この設定では、ソース値のデータ型がターゲット列の型と一致しない場合、Spark SQL は自動的に ANSI CAST 句を INSERT ステートメントに追加します。 このポリシーに基づくテーブルの挿入中に、Spark は無効なキャストをチェックして拒否し、データ品質を確保するために例外をスローします。 つまり、型の不一致が原因で挿入が失敗した場合、データがテーブルに部分的に書き込まれることはありません。

例 :

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

次の例は、Spark SQL が互換性のないデータの挿入を防ぎ、データの整合性を維持することを示しています。

spark.sql.storeAssignmentPolicyLEGACY に設定されている場合、Spark SQL は Spark 2.x までの一般的な動作に戻ります。 このモードでは、ANSI CAST を使用する代わりに、従来の CAST 操作が適用されます。 このポリシーでは、テーブルの挿入中に無効なキャストを実行すると、例外がスローされるのではなく、NULL 値または正しくない値が挿入されます。 例 :

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

強制型変換

型の上位変換と優先順位

spark.sql.ansi.enabledtrue に設定されている場合、Spark SQL では、データ型間の競合を解決する方法を制御するいくつかの規則を使用します。 この競合解決の中心となるのは、特定のデータ型の値を暗黙的に別のデータ型に昇格できるかどうかを定義する型の優先順位リストです。

データ型 優先順位リスト (最も狭い範囲から最も広い範囲の順)
Byte Byte -> Short -> Int -> Long -> Decimal -> Float* -> Double
ショート 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
Interval Interval
マップ Map**
Array Array**
構造体 Struct**
  • 最も一般的でない型解決の場合、精度の損失を回避するために浮動小数点はスキップされます。

** 複合型の場合、優先順位規則はそのコンポーネント要素に再帰的に適用されます。

文字列型と型指定されていない NULL には特別な規則が適用されます。 NULL は他の任意の型に昇格できますが、String は任意の単純データ型に昇格できます。

ここでは、優先順位リストを有向木として図で示しています: Graphical representation of precedence rules

最も一般的でない型解決

一連の型の最も一般的でない型は、一連の型のすべての要素によって優先順位リストから到達可能な最も狭い型です。

最も一般的でない型解決は、次の場合に使用します。

  • ある型のパラメーターを必要としている関数を、より狭い型の引数を使用して呼び出すことができるかどうかを決定します。
  • 複数のパラメーター (結合、最小、最大など) の共有引数型を必要とする関数の引数型を派生させます。
  • 算術演算や比較などの演算子のオペランド型を派生させます。
  • case 式などの式の結果型を派生させる。
  • 配列コンストラクターとマップ コンストラクターの要素、キー、または値の型を派生させます。

最も一般的でない型が FLOAT に解決される場合は、特別な規則が適用されます。 float 型の値で、型のいずれかが INT、BIGINT、または DECIMAL の場合、桁数が失われないようにするために、最も一般的でない型は DOUBLE にプッシュされます。

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

SQL 関数

一部の SQL 関数は、ANSI モード (spark.sql.ansi.enabled=true) では動作が異なる場合があります。

  • size: この関数は、ANSI モードでの null 入力に対して null を返します。
  • element_at:
    • 無効なインデックスを使用している場合、この関数は ArrayIndexOutOfBoundsException をスローします。
    • キーがマップに存在しない場合、この関数は NoSuchElementException をスローします。
  • elt: 無効なインデックスを使用している場合、この関数は ArrayIndexOutOfBoundsException をスローします。
  • make_date: 結果の日付が無効な場合、この関数は例外で失敗します。
  • make_timestamp: 結果のタイムスタンプが無効な場合、この関数は例外で失敗します。
  • make_interval: 結果の間隔が無効な場合、この関数は例外で失敗します。
  • next_day: 入力が有効な週の日付でない場合、この関数は IllegalArgumentException をスローします。
  • parse_url: 入力文字列が有効な URL でない場合、この関数は IllegalArgumentException をスローします。
  • to_date: 入力文字列を解析できない場合、またはパターン文字列が無効な場合、この関数は例外で失敗します。
  • to_timestamp: 入力文字列を解析できない場合、またはパターン文字列が無効な場合、この関数は例外で失敗します。
  • to_unix_timestamp: 入力文字列を解析できない場合、またはパターン文字列が無効な場合、この関数は例外で失敗します。
  • unix_timestamp: 入力文字列を解析できない場合、またはパターン文字列が無効な場合、この関数は例外で失敗します。

SQL 演算子

一部の SQL 演算子は、ANSI モード (spark.sql.ansi.enabled=true) では動作が異なる場合があります。

  • array_col[index]: 無効なインデックスを使用している場合、この演算子は ArrayIndexOutOfBoundsException をスローします。
  • map_col[key]: キーがマップに存在しない場合、この演算子は NoSuchElementException をスローします。
  • CAST(string_col AS TIMESTAMP): 入力文字列を解析できない場合、この演算子は例外で失敗します。
  • CAST(string_col AS DATE): 入力文字列を解析できない場合、この演算子は例外で失敗します。

ANSI モードの便利な関数

ANSI モードがオンの場合、無効な操作に対して例外がスローされます。 次の SQL 関数を使用して、このような例外を抑制できます。

  • try_cast: ランタイム エラーで例外をスローする代わりに NULL の結果を返す点を除き、CAST と同じです。
  • try_add: 整数値オーバーフローで例外をスローする代わりに NULL の結果を返す点を除き、加算演算子 + と同じです。
  • try_divide: 0 の除算で例外をスローする代わりに NULL の結果を返す点を除き、除算演算子 / と同じです。

SQL キーワード

spark.sql.ansi.enabled が true の場合、Spark SQL は ANSI モード パーサーを使用します。 このモードでは、Spark SQL には 2 種類のキーワードがあります。

  • 予約キーワード: 予約済みで、テーブル、ビュー、列、関数、エイリアスなどの識別子として使用できないキーワード。
  • 予約されていないキーワード: 特定のコンテキストでのみ特別な意味を持ち、他のコンテキストで識別子として使用できるキーワード。 たとえば、EXPLAIN SELECT ... はコマンドですが、EXPLAIN は他の場所で識別子として使用できます。

ANSI モードが無効になっている場合、Spark SQL には次の 2 種類のキーワードがあります。

  • 予約されていないキーワード: ANSI モードが有効になっている場合と同じ定義。
  • 予約されていない厳密なキーワード: 予約されていないキーワードの厳密なバージョン。テーブルの別名として使用することはできません。

既定では、spark.sql.ansi.enabled は false です。

Spark SQL のすべてのキーワードの一覧を次に示します。

Keyword Spark SQL ANSI モード Spark SQL の既定モード SQL-2016
ADD 予約されていない 予約されていない 予約されていない
AFTER 予約されていない 予約されていない 予約されていない
ALL 予約済み 予約されていない 予約済み
ALTER 予約されていない 予約されていない 予約済み
ALWAYS 予約されていない 予約されていない 予約されていない
分析 予約されていない 予約されていない 予約されていない
AND 予約済み 予約されていない 予約済み
ANTI 予約されていない 厳密で予約されていない 予約されていない
ANY 予約済み 予約されていない 予約済み
ARCHIVE 予約されていない 予約されていない 予約されていない
ARRAY 予約されていない 予約されていない 予約済み
AS 予約済み 予約されていない 予約済み
ASC 予約されていない 予約されていない 予約されていない
AT 予約されていない 予約されていない 予約済み
AUTHORIZATION 予約済み 予約されていない 予約済み
BETWEEN 予約されていない 予約されていない 予約済み
BOTH 予約済み 予約されていない 予約済み
BUCKET 予約されていない 予約されていない 予約されていない
BUCKETS 予約されていない 予約されていない 予約されていない
BY 予約されていない 予約されていない 予約済み
CACHE 予約されていない 予約されていない 予約されていない
CASCADE 予約されていない 予約されていない 予約されていない
CASE 予約済み 予約されていない 予約済み
CAST 予約済み 予約されていない 予約済み
CHANGE 予約されていない 予約されていない 予約されていない
CHECK 予約済み 予約されていない 予約済み
CLEAR 予約されていない 予約されていない 予約されていない
CLUSTER 予約されていない 予約されていない 予約されていない
CLUSTERED 予約されていない 予約されていない 予約されていない
CODEGEN 予約されていない 予約されていない 予約されていない
COLLATE 予約済み 予約されていない 予約済み
COLLECTION 予約されていない 予約されていない 予約されていない
COLUMN 予約済み 予約されていない 予約済み
COLUMNS 予約されていない 予約されていない 予約されていない
COMMENT 予約されていない 予約されていない 予約されていない
COMMIT 予約されていない 予約されていない 予約済み
COMPACT 予約されていない 予約されていない 予約されていない
COMPACTIONS 予約されていない 予約されていない 予約されていない
COMPUTE 予約されていない 予約されていない 予約されていない
CONCATENATE 予約されていない 予約されていない 予約されていない
CONSTRAINT 予約済み 予約されていない 予約済み
COST 予約されていない 予約されていない 予約されていない
CREATE 予約済み 予約されていない 予約済み
CROSS 予約済み 厳密で予約されていない 予約済み
CUBE 予約されていない 予約されていない 予約済み
CURRENT 予約されていない 予約されていない 予約済み
CURRENT_DATE 予約済み 予約されていない 予約済み
CURRENT_TIME 予約済み 予約されていない 予約済み
CURRENT_TIMESTAMP 予約済み 予約されていない 予約済み
CURRENT_USER 予約済み 予約されていない 予約済み
DATA 予約されていない 予約されていない 予約されていない
データ 予約されていない 予約されていない 予約されていない
DATABASES 予約されていない 予約されていない 予約されていない
DAY 予約されていない 予約されていない 予約されていない
DBPROPERTIES 予約されていない 予約されていない 予約されていない
DEFINED 予約されていない 予約されていない 予約されていない
DELETE 予約されていない 予約されていない 予約済み
DELIMITED 予約されていない 予約されていない 予約されていない
DESC 予約されていない 予約されていない 予約されていない
DESCRIBE 予約されていない 予約されていない 予約済み
DFS 予約されていない 予約されていない 予約されていない
DIRECTORIES 予約されていない 予約されていない 予約されていない
DIRECTORY 予約されていない 予約されていない 予約されていない
DISTINCT 予約済み 予約されていない 予約済み
DISTRIBUTE 予約されていない 予約されていない 予約されていない
DIV 予約されていない 予約されていない キーワードではない
DROP 予約されていない 予約されていない 予約済み
ELSE 予約済み 予約されていない 予約済み
END 予約済み 予約されていない 予約済み
ESCAPE 予約済み 予約されていない 予約済み
ESCAPED 予約されていない 予約されていない 予約されていない
EXCEPT 予約済み 厳密で予約されていない 予約済み
EXCHANGE 予約されていない 予約されていない 予約されていない
EXISTS 予約されていない 予約されていない 予約済み
EXPLAIN 予約されていない 予約されていない 予約されていない
EXPORT 予約されていない 予約されていない 予約されていない
EXTENDED 予約されていない 予約されていない 予約されていない
EXTERNAL 予約されていない 予約されていない 予約済み
EXTRACT 予約されていない 予約されていない 予約済み
FALSE 予約済み 予約されていない 予約済み
FETCH 予約済み 予約されていない 予約済み
FIELDS 予約されていない 予約されていない 予約されていない
FILTER 予約済み 予約されていない 予約済み
FILEFORMAT 予約されていない 予約されていない 予約されていない
FIRST 予約されていない 予約されていない 予約されていない
FN 予約されていない 予約されていない 予約されていない
FOLLOWING 予約されていない 予約されていない 予約されていない
FOR 予約済み 予約されていない 予約済み
FOREIGN 予約済み 予約されていない 予約済み
FORMAT 予約されていない 予約されていない 予約されていない
FORMATTED 予約されていない 予約されていない 予約されていない
FROM 予約済み 予約されていない 予約済み
FULL 予約済み 厳密で予約されていない 予約済み
FUNCTION 予約されていない 予約されていない 予約済み
FUNCTIONS 予約されていない 予約されていない 予約されていない
GENERATED 予約されていない 予約されていない 予約されていない
GLOBAL 予約されていない 予約されていない 予約済み
GRANT 予約済み 予約されていない 予約済み
GRANTS 予約されていない 予約されていない 予約されていない
GROUP 予約済み 予約されていない 予約済み
GROUPING 予約されていない 予約されていない 予約済み
HAVING 予約済み 予約されていない 予約済み
HOUR 予約されていない 予約されていない 予約されていない
IF 予約されていない 予約されていない キーワードではない
IGNORE 予約されていない 予約されていない 予約されていない
IMPORT 予約されていない 予約されていない 予約されていない
IN 予約済み 予約されていない 予約済み
INDEX 予約されていない 予約されていない 予約されていない
INDEXES 予約されていない 予約されていない 予約されていない
INNER 予約済み 厳密で予約されていない 予約済み
INPATH 予約されていない 予約されていない 予約されていない
INPUTFORMAT 予約されていない 予約されていない 予約されていない
INSERT 予約されていない 予約されていない 予約済み
INTERSECT 予約済み 厳密で予約されていない 予約済み
INTERVAL 予約されていない 予約されていない 予約済み
INTO 予約済み 予約されていない 予約済み
IS 予約済み 予約されていない 予約済み
ITEMS 予約されていない 予約されていない 予約されていない
JOIN 予約済み 厳密で予約されていない 予約済み
KEY 予約されていない 予約されていない 予約されていない
KEYS 予約されていない 予約されていない 予約されていない
LAST 予約されていない 予約されていない 予約されていない
LATERAL 予約済み 厳密で予約されていない 予約済み
LAZY 予約されていない 予約されていない 予約されていない
LEADING 予約済み 予約されていない 予約済み
LEFT 予約済み 厳密で予約されていない 予約済み
LIKE 予約されていない 予約されていない 予約済み
ILIKE 予約されていない 予約されていない 予約されていない
LIMIT 予約されていない 予約されていない 予約されていない
LINES 予約されていない 予約されていない 予約されていない
リスト 予約されていない 予約されていない 予約されていない
LOAD 予約されていない 予約されていない 予約されていない
LOCAL 予約されていない 予約されていない 予約済み
LOCATION 予約されていない 予約されていない 予約されていない
LOCK 予約されていない 予約されていない 予約されていない
LOCKS 予約されていない 予約されていない 予約されていない
LOGICAL 予約されていない 予約されていない 予約されていない
MACRO 予約されていない 予約されていない 予約されていない
MAP 予約されていない 予約されていない 予約されていない
MATCHED 予約されていない 予約されていない 予約されていない
MERGE 予約されていない 予約されていない 予約されていない
MINUTE 予約されていない 予約されていない 予約されていない
MINUS 予約されていない 厳密で予約されていない 予約されていない
MONTH 予約されていない 予約されていない 予約されていない
MSCK 予約されていない 予約されていない 予約されていない
NAMESPACE 予約されていない 予約されていない 予約されていない
NAMESPACES 予約されていない 予約されていない 予約されていない
NATURAL 予約済み 厳密で予約されていない 予約済み
NO 予約されていない 予約されていない 予約済み
NOT 予約済み 予約されていない 予約済み
NULL 予約済み 予約されていない 予約済み
NULLS 予約されていない 予約されていない 予約されていない
OF 予約されていない 予約されていない 予約済み
ON 予約済み 厳密で予約されていない 予約済み
ONLY 予約済み 予約されていない 予約済み
OPTION 予約されていない 予約されていない 予約されていない
OPTIONS 予約されていない 予約されていない 予約されていない
または 予約済み 予約されていない 予約済み
ORDER 予約済み 予約されていない 予約済み
OUT 予約されていない 予約されていない 予約済み
OUTER 予約済み 予約されていない 予約済み
OUTPUTFORMAT 予約されていない 予約されていない 予約されていない
OVER 予約されていない 予約されていない 予約されていない
OVERLAPS 予約済み 予約されていない 予約済み
OVERLAY 予約されていない 予約されていない 予約されていない
OVERWRITE 予約されていない 予約されていない 予約されていない
PARTITION 予約されていない 予約されていない 予約済み
PARTITIONED 予約されていない 予約されていない 予約されていない
PARTITIONS 予約されていない 予約されていない 予約されていない
PERCENT 予約されていない 予約されていない 予約されていない
PIVOT 予約されていない 予約されていない 予約されていない
PLACING 予約されていない 予約されていない 予約されていない
POSITION 予約されていない 予約されていない 予約済み
PRECEDING 予約されていない 予約されていない 予約されていない
PRIMARY 予約済み 予約されていない 予約済み
PRINCIPALS 予約されていない 予約されていない 予約されていない
PROPERTIES 予約されていない 予約されていない 予約されていない
PURGE 予約されていない 予約されていない 予約されていない
QUALIFY 予約済み 予約されていない 予約済み
QUERY 予約されていない 予約されていない 予約されていない
RANGE 予約されていない 予約されていない 予約済み
RECIPIENT 予約されていない 予約されていない 予約されていない
RECIPIENTS 予約されていない 予約されていない 予約されていない
RECORDREADER 予約されていない 予約されていない 予約されていない
RECORDWRITER 予約されていない 予約されていない 予約されていない
RECOVER 予約されていない 予約されていない 予約されていない
REDUCE 予約されていない 予約されていない 予約されていない
REFERENCES 予約済み 予約されていない 予約済み
REFRESH 予約されていない 予約されていない 予約されていない
REGEXP 予約されていない 予約されていない キーワードではない
REMOVE 予約されていない 予約されていない 予約されていない
RENAME 予約されていない 予約されていない 予約されていない
REPAIR 予約されていない 予約されていない 予約されていない
REPLACE 予約されていない 予約されていない 予約されていない
RESET 予約されていない 予約されていない 予約されていない
RESPECT 予約されていない 予約されていない 予約されていない
RESTRICT 予約されていない 予約されていない 予約されていない
REVOKE 予約されていない 予約されていない 予約済み
RIGHT 予約済み 厳密で予約されていない 予約済み
RLIKE 予約されていない 予約されていない 予約されていない
ROLE 予約されていない 予約されていない 予約されていない
ROLES 予約されていない 予約されていない 予約されていない
ROLLBACK 予約されていない 予約されていない 予約済み
ROLLUP 予約されていない 予約されていない 予約済み
ROW 予約されていない 予約されていない 予約済み
ROWS 予約されていない 予約されていない 予約済み
方式 予約されていない 予約されていない 予約されていない
SCHEMAS 予約されていない 予約されていない キーワードではない
SECOND 予約されていない 予約されていない 予約されていない
SELECT 予約済み 予約されていない 予約済み
SEMI 予約されていない 厳密で予約されていない 予約されていない
SEPARATED 予約されていない 予約されていない 予約されていない
SERDE 予約されていない 予約されていない 予約されていない
SERDEPROPERTIES 予約されていない 予約されていない 予約されていない
SESSION_USER 予約済み 予約されていない 予約済み
SET 予約されていない 予約されていない 予約済み
SETS 予約されていない 予約されていない 予約されていない
SHARE 予約されていない 予約されていない 予約されていない
SHARES 予約されていない 予約されていない 予約されていない
SHOW 予約されていない 予約されていない 予約されていない
SKEWED 予約されていない 予約されていない 予約されていない
SOME 予約済み 予約されていない 予約済み
SORT 予約されていない 予約されていない 予約されていない
SORTED 予約されていない 予約されていない 予約されていない
START 予約されていない 予約されていない 予約済み
STATISTICS 予約されていない 予約されていない 予約されていない
STORED 予約されていない 予約されていない 予約されていない
STRATIFY 予約されていない 予約されていない 予約されていない
STRUCT 予約されていない 予約されていない 予約されていない
SUBSTR 予約されていない 予約されていない 予約されていない
SUBSTRING 予約されていない 予約されていない 予約されていない
同期 予約されていない 予約されていない 予約されていない
TABLE 予約済み 予約されていない 予約済み
TABLES 予約されていない 予約されていない 予約されていない
TABLESAMPLE 予約されていない 予約されていない 予約済み
TBLPROPERTIES 予約されていない 予約されていない 予約されていない
TEMP 予約されていない 予約されていない キーワードではない
TEMPORARY 予約されていない 予約されていない 予約されていない
TERMINATED 予約されていない 予約されていない 予約されていない
THEN 予約済み 予約されていない 予約済み
TIME 予約済み 予約されていない 予約済み
TO 予約済み 予約されていない 予約済み
TOUCH 予約されていない 予約されていない 予約されていない
TRAILING 予約済み 予約されていない 予約済み
TRANSACTION 予約されていない 予約されていない 予約されていない
TRANSACTIONS 予約されていない 予約されていない 予約されていない
TRANSFORM 予約されていない 予約されていない 予約されていない
TRIM 予約されていない 予約されていない 予約されていない
TRUE 予約されていない 予約されていない 予約済み
TRUNCATE 予約されていない 予約されていない 予約済み
TRY_CAST 予約されていない 予約されていない 予約されていない
TYPE 予約されていない 予約されていない 予約されていない
UNARCHIVE 予約されていない 予約されていない 予約されていない
UNBOUNDED 予約されていない 予約されていない 予約されていない
UNCACHE 予約されていない 予約されていない 予約されていない
UNION 予約済み 厳密で予約されていない 予約済み
UNIQUE 予約済み 予約されていない 予約済み
UNKNOWN 予約済み 予約されていない 予約済み
UNLOCK 予約されていない 予約されていない 予約されていない
UNSET 予約されていない 予約されていない 予約されていない
UPDATE 予約されていない 予約されていない 予約済み
USE 予約されていない 予約されていない 予約されていない
USER 予約済み 予約されていない 予約済み
USING 予約済み 厳密で予約されていない 予約済み
VALUES 予約されていない 予約されていない 予約済み
VIEW 予約されていない 予約されていない 予約されていない
VIEWS 予約されていない 予約されていない 予約されていない
WHEN 予約済み 予約されていない 予約済み
WHERE 予約済み 予約されていない 予約済み
WINDOW 予約されていない 予約されていない 予約済み
WITH 予約済み 予約されていない 予約済み
YEAR 予約されていない 予約されていない 予約されていない
ZONE 予約されていない 予約されていない 予約されていない