ANSI 準拠

Spark SQL では、SQL 標準に準拠するために 2 つのオプションがあります。spark.sql.ansi.enabledspark.sql.storeAssignmentPolicy (詳細は下の表を参照)。

spark.sql.ansi.enabledtrue に設定されている場合、Spark SQL は Hive 準拠ではなく、ANSI 準拠のダイアレクトを使用します。たとえば、Spark は、SQL 演算子/関数への入力が無効な場合、null 結果を返す代わりに、実行時に例外をスローします。一部の ANSI ダイアレクト機能は ANSI SQL 標準から直接のものではないかもしれませんが、その動作は ANSI SQL のスタイルに沿っています。

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

spark.sql.storeAssignmentPolicyANSI に設定されている場合、Spark SQL は ANSI ストア割り当てルールに準拠します。この設定のデフォルト値は ANSI であり、設定 spark.sql.ansi.enabled はデフォルトで無効になっているため、これは別の設定です。

プロパティ名 デフォルト 意味 バージョン
spark.sql.ansi.enabled false true の場合、Spark は ANSI SQL 仕様に準拠しようとします。
1. Spark SQL は、整数のオーバーフローエラー、文字列解析エラーなど、無効な操作に対して実行時例外をスローします。
2. Spark は、データ型間の競合を解決するために、異なる型の強制規則を使用します。この規則は、一貫してデータ型の優先順位に基づいています。
3.0.0
spark.sql.storeAssignmentPolicy ANSI 異なるデータ型の列に値を挿入する場合、Spark は型変換を実行します。現在、型の強制規則には、ANSI、legacy、strict の 3 つのポリシーをサポートしています。
1. ANSI ポリシーでは、Spark は ANSI SQL に従って型の強制を実行します。実際には、動作はほとんど PostgreSQL と同じです。文字列を int に変換したり、double を boolean に変換するなど、不合理な型の変換を許可しません。数値型の列に挿入する場合、値がターゲットデータ型の範囲外にあるとオーバーフローエラーがスローされます。
2. legacy ポリシーでは、Spark は有効な Cast である限り、非常に緩い型強制を許可します。たとえば、文字列を int に変換したり、double を boolean に変換することは許可されています。また、これは Spark 2.x で唯一の動作であり、Hive と互換性があります。
3. strict ポリシーでは、Spark は型強制で精度の低下やデータ切り捨てを一切許可しません。たとえば、double を int に変換したり、decimal を double に変換することは許可されていません。
3.0.0

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

算術演算

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

-- `spark.sql.ansi.enabled=true`
SELECT 2147483647 + 1;
org.apache.spark.SparkArithmeticException: [ARITHMETIC_OVERFLOW] integer overflow. Use 'try_add' to tolerate overflow and return NULL instead. If necessary set spark.sql.ansi.enabled to "false" to bypass this error.
== SQL(line 1, position 8) ==
SELECT 2147483647 + 1
       ^^^^^^^^^^^^^^

SELECT abs(-2147483648);
org.apache.spark.SparkArithmeticException: [ARITHMETIC_OVERFLOW] integer overflow. If necessary set spark.sql.ansi.enabled to "false" to bypass this error.

-- `spark.sql.ansi.enabled=false`
SELECT 2147483647 + 1;
+----------------+
|(2147483647 + 1)|
+----------------+
|     -2147483648|
+----------------+

SELECT abs(-2147483648);
+----------------+
|abs(-2147483648)|
+----------------+
|     -2147483648|
+----------------+

キャスト

spark.sql.ansi.enabledtrue に設定されている場合、CAST 構文による明示的なキャストは、標準で定義されている不正なキャストパターンに対して実行時例外をスローします。たとえば、文字列から整数へのキャストなどです。

また、ANSI SQL モードでは、ANSI モードが無効になっている場合は許可される以下の型変換を禁止します。

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

ソース\ターゲット 数値 文字列 日付 タイムスタンプ タイムスタンプ_NTZ 間隔 ブール バイナリ 配列 マップ 構造体
数値 Y Y N Y N Y Y N N N N
文字列 Y Y Y Y Y Y Y Y N N N
日付 N Y Y Y Y N N N N N N
タイムスタンプ Y Y Y Y Y N N N N N N
タイムスタンプ_NTZ N Y Y Y Y N N N N N N
間隔 Y Y N N N Y N N N N N
ブール Y Y N N N N Y N N N N
バイナリ N Y N N N N N Y N N N
配列 N Y N N N N N N Y N N
マップ N Y N N N N N N N Y N
構造体 N Y N N N N N N N N Y

上記の表では、新しい構文を使用したすべての CAST は赤Yでマークされています

-- Examples of explicit casting

-- `spark.sql.ansi.enabled=true`
SELECT CAST('a' AS INT);
org.apache.spark.SparkNumberFormatException: [CAST_INVALID_INPUT] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed. Correct the value as per the syntax, or change its target type. Use `try_cast` to tolerate malformed input and return NULL instead. If necessary set "spark.sql.ansi.enabled" to "false" to bypass this error.
== SQL(line 1, position 8) ==
SELECT CAST('a' AS INT)
       ^^^^^^^^^^^^^^^^

SELECT CAST(2147483648L AS INT);
org.apache.spark.SparkArithmeticException: [CAST_OVERFLOW] The value 2147483648L of the type "BIGINT" cannot be cast to "INT" due to an overflow. Use `try_cast` to tolerate overflow and return NULL instead. If necessary set "spark.sql.ansi.enabled" to "false" to bypass this error.

SELECT CAST(DATE'2020-01-01' AS INT);
org.apache.spark.sql.AnalysisException: cannot resolve 'CAST(DATE '2020-01-01' AS INT)' due to data type mismatch: cannot cast date to int.
To convert values from date to int, you can use function UNIX_DATE instead.

-- `spark.sql.ansi.enabled=false` (This is a default behaviour)
SELECT CAST('a' AS INT);
+--------------+
|CAST(a AS INT)|
+--------------+
|          null|
+--------------+

SELECT CAST(2147483648L AS INT);
+-----------------------+
|CAST(2147483648 AS INT)|
+-----------------------+
|            -2147483648|
+-----------------------+

SELECT CAST(DATE'2020-01-01' AS INT)
+------------------------------+
|CAST(DATE '2020-01-01' AS INT)|
+------------------------------+
|                          null|
+------------------------------+

-- Examples of store assignment rules
CREATE TABLE t (v INT);

-- `spark.sql.storeAssignmentPolicy=ANSI`
INSERT INTO t VALUES ('1');
org.apache.spark.sql.AnalysisException: [INCOMPATIBLE_DATA_FOR_TABLE.CANNOT_SAFELY_CAST] Cannot write incompatible data for table `spark_catalog`.`default`.`t`: Cannot safely cast `v`: "STRING" to "INT".

-- `spark.sql.storeAssignmentPolicy=LEGACY` (This is a legacy behaviour until Spark 2.x)
INSERT INTO t VALUES ('1');
SELECT * FROM t;
+---+
|  v|
+---+
|  1|
+---+

キャストでの丸め

小数部を持つ 10 進数を、INTERVAL HOUR TO SECOND のように終了単位として SECOND を持つ間隔型にキャストする場合、Spark は、両方の近傍が等距離にある場合を除き、小数部を「最近傍」に向かって丸めます。この場合は、切り上げます。

ストア割り当て

冒頭で述べたように、spark.sql.storeAssignmentPolicyANSI (これはデフォルト値) に設定されている場合、Spark SQL はテーブル挿入時に ANSI ストア割り当てルールに準拠します。テーブル挿入でのソースとターゲットのデータ型の有効な組み合わせは、次の表で与えられます。

ソース\ターゲット 数値 文字列 日付 タイムスタンプ タイムスタンプ_NTZ 間隔 ブール バイナリ 配列 マップ 構造体
数値 Y Y N N N N N N N N N
文字列 N Y N N N N N N N N N
日付 N Y Y Y Y N N N N N N
タイムスタンプ N Y Y Y Y N N N N N N
タイムスタンプ_NTZ N Y Y Y Y N N N N N N
間隔 N Y N N N N* N N N N N
ブール N Y N N N N Y N N N N
バイナリ N Y N N N N N Y N N N
配列 N N N N N N N N Y** N N
マップ N N N N N N N N N Y** N
構造体 N N N N N N N N N N Y**

* Spark は間隔型のテーブル列をサポートしていません。

** 配列/マップ/構造体型の場合、データ型チェックルールは、その構成要素に対して再帰的に適用されます。

テーブル挿入中、Spark は数値のオーバーフロー時に例外をスローします。

CREATE TABLE test(i INT);

INSERT INTO test VALUES (2147483648L);
org.apache.spark.SparkArithmeticException: [CAST_OVERFLOW_IN_TABLE_INSERT] Fail to insert a value of "BIGINT" type into the "INT" type column `i` due to an overflow. Use `try_cast` on the input value to tolerate overflow and return NULL instead.

型の強制

型の昇格と優先順位

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

データ型 優先順位リスト (最も狭いものから最も広いものへ)
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 -> Timestamp_NTZ -> Timestamp
タイムスタンプ タイムスタンプ
文字列 String、Long -> Double、Date -> Timestamp_NTZ -> Timestamp、Boolean、Binary **
バイナリ バイナリ
ブール ブール
間隔 間隔
マップ Map***
配列 Array***
構造体 Struct***

* 最小共通型解決のために、精度が失われるのを防ぐために float はスキップされます。

** 文字列は、複数の種類のデータ型に昇格できます。Byte/Short/Int/Decimal/Float は、この優先順位リストには含まれていないことに注意してください。Byte/Short/Int と文字列の最小共通型は Long であり、Decimal/Float の最小共通型は Double です。

*** 複合型の場合、優先順位ルールは、その構成要素に対して再帰的に適用されます。

型なし NULL には特別なルールが適用されます。NULL は他の任意の型に昇格できます。

これは、優先順位リストを有向木としてグラフで表したものです: 型の優先順位リスト

最小共通型解決

型の集合における最小共通型は、型の集合のすべての要素によって、優先順位リストから到達可能な最も狭い型です。

最小共通型解決は、以下の場合に使用されます。

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

> SELECT typeof(coalesce(1, '2147483648'))
BIGINT
> SELECT typeof(coalesce(1.0, '2147483648'))
DOUBLE
> SELECT typeof(coalesce(DATE'2021-01-01', '2022-01-01'))
DATE

SQL関数

関数呼び出し

ANSIモード(spark.sql.ansi.enabled=true)では、Spark SQLの関数呼び出しは

> SET spark.sql.ansi.enabled=true;
-- implicitly cast Int to String type
> SELECT concat('total number: ', 1);
total number: 1
-- implicitly cast Timestamp to Date type
> select datediff(now(), current_date);
0

-- implicitly cast String to Double type
> SELECT ceil('0.1');
1
-- special rule: implicitly cast NULL to Date type
> SELECT year(null);
NULL

> CREATE TABLE t(s string);
-- Can't store String column as Numeric types.
> SELECT ceil(s) from t;
Error in query: cannot resolve 'CEIL(spark_catalog.default.t.s)' due to data type mismatch
-- Can't store String column as Date type.
> select year(s) from t;
Error in query: cannot resolve 'year(spark_catalog.default.t.s)' due to data type mismatch

異なる動作をする関数

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

SQL演算子

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

ANSIモードに役立つ関数

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

SQLキーワード(オプション、デフォルトでは無効)

spark.sql.ansi.enabledspark.sql.ansi.enforceReservedKeywordsの両方がtrueの場合、Spark SQLはANSIモードパーサーを使用します。

ANSIモードパーサーを使用すると、Spark SQLには2種類のキーワードがあります。

デフォルトパーサーを使用すると、Spark SQLには2種類のキーワードがあります。

デフォルトでは、spark.sql.ansi.enabledspark.sql.ansi.enforceReservedKeywordsの両方がfalseです。

以下は、Spark SQLのすべてのキーワードのリストです。

キーワード Spark SQL
ANSIモード
Spark SQL
デフォルトモード
SQL-2016
ADD 非予約 非予約 非予約
AFTER 非予約 非予約 非予約
ALL 予約 非予約 予約
ALTER 非予約 非予約 予約
ALWAYS 非予約 非予約 非予約
ANALYZE 非予約 非予約 非予約
AND 予約 非予約 予約
ANTI 非予約 厳密な非予約 非予約
ANY 予約 非予約 予約
ANY_VALUE 非予約 非予約 非予約
ARCHIVE 非予約 非予約 非予約
ARRAY 非予約 非予約 予約
AS 予約 非予約 予約
ASC 非予約 非予約 非予約
AT 非予約 非予約 予約
AUTHORIZATION 予約 非予約 予約
BETWEEN 非予約 非予約 予約
BIGINT 非予約 非予約 予約
BINARY 非予約 非予約 予約
BOOLEAN 非予約 非予約 予約
BOTH 予約 非予約 予約
BUCKET 非予約 非予約 非予約
BUCKETS 非予約 非予約 非予約
BY 非予約 非予約 予約
BYTE 非予約 非予約 非予約
CACHE 非予約 非予約 非予約
CASCADE 非予約 非予約 非予約
CASE 予約 非予約 予約
CAST 予約 非予約 予約
CATALOG 非予約 非予約 非予約
CATALOGS 非予約 非予約 非予約
CHANGE 非予約 非予約 非予約
CHAR 非予約 非予約 予約
CHARACTER 非予約 非予約 予約
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 非予約 非予約 非予約
DATE 非予約 非予約 予約
DATABASE 非予約 非予約 非予約
DATABASES 非予約 非予約 非予約
DATEADD 非予約 非予約 非予約
DATE_ADD 非予約 非予約 非予約
DATEDIFF 非予約 非予約 非予約
DATE_DIFF 非予約 非予約 非予約
DAY 非予約 非予約 非予約
DAYS 非予約 非予約 非予約
DAYOFYEAR 非予約 非予約 非予約
DBPROPERTIES 非予約 非予約 非予約
DEC 非予約 非予約 予約
DECIMAL 非予約 非予約 予約
DEFAULT 非予約 非予約 非予約
DEFINED 非予約 非予約 非予約
DELETE 非予約 非予約 予約
DELIMITED 非予約 非予約 非予約
DESC 非予約 非予約 非予約
DESCRIBE 非予約 非予約 予約
DFS 非予約 非予約 非予約
DIRECTORIES 非予約 非予約 非予約
DIRECTORY 非予約 非予約 非予約
DISTINCT 予約 非予約 予約
DISTRIBUTE 非予約 非予約 非予約
DIV 非予約 非予約 キーワードではない
DOUBLE 非予約 非予約 予約
DROP 非予約 非予約 予約
ELSE 予約 非予約 予約
END 予約 非予約 予約
ESCAPE 予約 非予約 予約
ESCAPED 非予約 非予約 非予約
EXCEPT 予約 厳密な非予約 予約
EXCHANGE 非予約 非予約 非予約
EXCLUDE 非予約 非予約 非予約
EXISTS 非予約 非予約 予約
EXPLAIN 非予約 非予約 非予約
EXPORT 非予約 非予約 非予約
EXTENDED 非予約 非予約 非予約
EXTERNAL 非予約 非予約 予約
EXTRACT 非予約 非予約 予約
FALSE 予約 非予約 予約
FETCH 予約 非予約 予約
FIELDS 非予約 非予約 非予約
FILTER 予約 非予約 予約
FILEFORMAT 非予約 非予約 非予約
FIRST 非予約 非予約 非予約
FLOAT 非予約 非予約 予約
FOLLOWING 非予約 非予約 非予約
FOR 予約 非予約 予約
FOREIGN 予約 非予約 予約
FORMAT 非予約 非予約 非予約
FORMATTED 非予約 非予約 非予約
FROM 予約 非予約 予約
FULL 予約 厳密な非予約 予約
FUNCTION 非予約 非予約 予約
FUNCTIONS 非予約 非予約 非予約
GENERATED 非予約 非予約 非予約
GLOBAL 非予約 非予約 予約
GRANT 予約 非予約 予約
GROUP 予約 非予約 予約
GROUPING 非予約 非予約 予約
HAVING 予約 非予約 予約
HOUR 非予約 非予約 非予約
HOURS 非予約 非予約 非予約
IDENTIFIER 非予約 非予約 非予約
IF 非予約 非予約 キーワードではない
IGNORE 非予約 非予約 非予約
IMPORT 非予約 非予約 非予約
IN 予約 非予約 予約
INCLUDE 非予約 非予約 非予約
INDEX 非予約 非予約 非予約
INDEXES 非予約 非予約 非予約
INNER 予約 厳密な非予約 予約
INPATH 非予約 非予約 非予約
INPUTFORMAT 非予約 非予約 非予約
INSERT 非予約 非予約 予約
INT 非予約 非予約 予約
INTEGER 非予約 非予約 予約
INTERSECT 予約 厳密な非予約 予約
INTERVAL 非予約 非予約 予約
INTO 予約 非予約 予約
IS 予約 非予約 予約
ITEMS 非予約 非予約 非予約
JOIN 予約 厳密な非予約 予約
KEYS 非予約 非予約 非予約
LAST 非予約 非予約 非予約
LATERAL 予約 厳密な非予約 予約
LAZY 非予約 非予約 非予約
LEADING 予約 非予約 予約
LEFT 予約 厳密な非予約 予約
LIKE 非予約 非予約 予約
ILIKE 非予約 非予約 非予約
LIMIT 非予約 非予約 非予約
LINES 非予約 非予約 非予約
LIST 非予約 非予約 非予約
LOAD 非予約 非予約 非予約
LOCAL 非予約 非予約 予約
LOCATION 非予約 非予約 非予約
LOCK 非予約 非予約 非予約
LOCKS 非予約 非予約 非予約
LOGICAL 非予約 非予約 非予約
LONG 非予約 非予約 非予約
MACRO 非予約 非予約 非予約
MAP 非予約 非予約 非予約
MATCHED 非予約 非予約 非予約
MERGE 非予約 非予約 非予約
MICROSECOND 非予約 非予約 非予約
MICROSECONDS 非予約 非予約 非予約
MILLISECOND 非予約 非予約 非予約
MILLISECONDS 非予約 非予約 非予約
MINUTE 非予約 非予約 非予約
MINUTES 非予約 非予約 非予約
MINUS 非予約 厳密な非予約 非予約
MONTH 非予約 非予約 非予約
MONTHS 非予約 非予約 非予約
MSCK 非予約 非予約 非予約
NAME 非予約 非予約 非予約
NAMESPACE 非予約 非予約 非予約
NAMESPACES 非予約 非予約 非予約
NANOSECOND 非予約 非予約 非予約
NANOSECONDS 非予約 非予約 非予約
NATURAL 予約 厳密な非予約 予約
NO 非予約 非予約 予約
NOT 予約 非予約 予約
NULL 予約 非予約 予約
NULLS 非予約 非予約 非予約
NUMERIC 非予約 非予約 非予約
OF 非予約 非予約 予約
OFFSET 予約 非予約 予約
ON 予約 厳密な非予約 予約
ONLY 予約 非予約 予約
OPTION 非予約 非予約 非予約
OPTIONS 非予約 非予約 非予約
OR 予約 非予約 予約
ORDER 予約 非予約 予約
OUT 非予約 非予約 予約
OUTER 予約 非予約 予約
OUTPUTFORMAT 非予約 非予約 非予約
OVER 非予約 非予約 非予約
OVERLAPS 予約 非予約 予約
OVERLAY 非予約 非予約 非予約
OVERWRITE 非予約 非予約 非予約
PARTITION 非予約 非予約 予約
PARTITIONED 非予約 非予約 非予約
PARTITIONS 非予約 非予約 非予約
PERCENT 非予約 非予約 非予約
PERCENTILE_CONT 予約 非予約 非予約
PERCENTILE_DISC 予約 非予約 非予約
PIVOT 非予約 非予約 非予約
PLACING 非予約 非予約 非予約
POSITION 非予約 非予約 予約
PRECEDING 非予約 非予約 非予約
PRIMARY 予約 非予約 予約
PRINCIPALS 非予約 非予約 非予約
PROPERTIES 非予約 非予約 非予約
PURGE 非予約 非予約 非予約
QUARTER 非予約 非予約 非予約
QUERY 非予約 非予約 非予約
RANGE 非予約 非予約 予約
REAL 非予約 非予約 予約
RECORDREADER 非予約 非予約 非予約
RECORDWRITER 非予約 非予約 非予約
RECOVER 非予約 非予約 非予約
REDUCE 非予約 非予約 非予約
REFERENCES 予約 非予約 予約
REFRESH 非予約 非予約 非予約
REGEXP 非予約 非予約 キーワードではない
RENAME 非予約 非予約 非予約
REPAIR 非予約 非予約 非予約
REPEATABLE 非予約 非予約 非予約
REPLACE 非予約 非予約 非予約
RESET 非予約 非予約 非予約
RESPECT 非予約 非予約 非予約
RESTRICT 非予約 非予約 非予約
REVOKE 非予約 非予約 予約
RIGHT 予約 厳密な非予約 予約
RLIKE 非予約 非予約 非予約
ROLE 非予約 非予約 非予約
ROLES 非予約 非予約 非予約
ROLLBACK 非予約 非予約 予約
ROLLUP 非予約 非予約 予約
ROW 非予約 非予約 予約
ROWS 非予約 非予約 予約
SCHEMA 非予約 非予約 非予約
SCHEMAS 非予約 非予約 非予約
SECOND 非予約 非予約 非予約
SECONDS 非予約 非予約 非予約
SELECT 予約 非予約 予約
SEMI 非予約 厳密な非予約 非予約
SEPARATED 非予約 非予約 非予約
SERDE 非予約 非予約 非予約
SERDEPROPERTIES 非予約 非予約 非予約
SESSION_USER 予約 非予約 予約
SET 非予約 非予約 予約
SETS 非予約 非予約 非予約
SHORT 非予約 非予約 非予約
SHOW 非予約 非予約 非予約
SKEWED 非予約 非予約 非予約
SMALLINT 非予約 非予約 予約
SOME 予約 非予約 予約
SORT 非予約 非予約 非予約
SORTED 非予約 非予約 非予約
SOURCE 非予約 非予約 非予約
START 非予約 非予約 予約
STATISTICS 非予約 非予約 非予約
STORED 非予約 非予約 非予約
STRATIFY 非予約 非予約 非予約
STRING 非予約 非予約 非予約
STRUCT 非予約 非予約 非予約
SUBSTR 非予約 非予約 非予約
SUBSTRING 非予約 非予約 非予約
SYNC 非予約 非予約 非予約
SYSTEM_TIME 非予約 非予約 非予約
SYSTEM_VERSION 非予約 非予約 非予約
TABLE 予約 非予約 予約
TABLES 非予約 非予約 非予約
TABLESAMPLE 非予約 非予約 予約
TARGET 非予約 非予約 非予約
TBLPROPERTIES 非予約 非予約 非予約
TEMP 非予約 非予約 キーワードではない
TEMPORARY 非予約 非予約 非予約
TERMINATED 非予約 非予約 非予約
THEN 予約 非予約 予約
TIME 予約 非予約 予約
TIMESTAMP 非予約 非予約 非予約
TIMESTAMP_LTZ 非予約 非予約 非予約
TIMESTAMP_NTZ 非予約 非予約 非予約
TIMESTAMPADD 非予約 非予約 非予約
TIMESTAMPDIFF 非予約 非予約 非予約
TINYINT 非予約 非予約 非予約
TO 予約 非予約 予約
TOUCH 非予約 非予約 非予約
TRAILING 予約 非予約 予約
TRANSACTION 非予約 非予約 非予約
TRANSACTIONS 非予約 非予約 非予約
TRANSFORM 非予約 非予約 非予約
TRIM 非予約 非予約 非予約
TRUE 非予約 非予約 予約
TRUNCATE 非予約 非予約 予約
TRY_CAST 非予約 非予約 非予約
TYPE 非予約 非予約 非予約
UNARCHIVE 非予約 非予約 非予約
UNBOUNDED 非予約 非予約 非予約
UNCACHE 非予約 非予約 非予約
UNION 予約 厳密な非予約 予約
UNIQUE 予約 非予約 予約
UNKNOWN 予約 非予約 予約
UNLOCK 非予約 非予約 非予約
UNPIVOT 非予約 非予約 非予約
UNSET 非予約 非予約 非予約
UPDATE 非予約 非予約 予約
USE 非予約 非予約 非予約
USER 予約 非予約 予約
USING 予約 厳密な非予約 予約
VALUES 非予約 非予約 予約
VARCHAR 非予約 非予約 予約
VERSION 非予約 非予約 非予約
VIEW 非予約 非予約 非予約
VIEWS 非予約 非予約 非予約
VOID 非予約 非予約 非予約
WEEK 非予約 非予約 非予約
WEEKS 非予約 非予約 非予約
WHEN 予約 非予約 予約
WHERE 予約 非予約 予約
ウィンドウ 非予約 非予約 予約
付き 予約 非予約 予約
以内 予約 非予約 予約
X 非予約 非予約 非予約
非予約 非予約 非予約
年間 非予約 非予約 非予約
ゾーン 非予約 非予約 非予約