リテラル
リテラル(定数とも呼ばれます)は、固定されたデータ値を表します。Spark SQL は以下のリテラルをサポートしています。
文字列リテラル
文字列リテラルは、文字列表現を指定するために使用されます。
構文
[ r ] { 'char [ ... ]' | "char [ ... ]" }
パラメータ
-
char
文字セットの1文字。特殊文字(例:
'または\)をエスケープするには、\を使用します。Unicode 文字を表すには、\uxxxxまたは\Uxxxxxxxxの形式の16ビットまたは32ビットUnicodeエスケープを使用します。ここで、xxxx と xxxxxxxx はそれぞれ16ビットおよび32ビットの16進コードポイントです(例:あの場合は\u3042、👍の場合は\U0001F44D)。ASCII 文字は、\で始まる8進数(例:\101はAを表します)としても表すことができます。 -
r
大文字小文字を区別しない、
RAWを示します。文字列リテラルがrプレフィックスで始まる場合、特殊文字も Unicode 文字も\でエスケープされません。
以下のエスケープシーケンスは、(r プレフィックスなしの)通常の文字列リテラルで認識され、以下のルールに従って置換されます。
\0->\u0000、コード0のUnicode文字。\b->\u0008、バックスペース。\n->\u000a、ラインフィード。\r->\u000d、キャリッジリターン。\t->\u0009、水平タブ。\Z->\u001A、置換。\%->\%;\_->\_;\<other char>-><other char>、スラッシュをスキップして文字をそのまま残します。
上記のアンエスケープルールは、SQL 設定 spark.sql.parser.escapedStringLiterals を true に設定することで無効にできます。
例
SELECT 'Hello, World!' AS col;
+-------------+
| col|
+-------------+
|Hello, World!|
+-------------+
SELECT "SPARK SQL" AS col;
+---------+
| col|
+---------+
|SPARK SQL|
+---------+
SELECT 'it\'s $10.' AS col;
+---------+
| col|
+---------+
|it's $10.|
+---------+
SELECT r"'\n' represents newline character." AS col;
+----------------------------------+
| col|
+----------------------------------+
|'\n' represents newline character.|
+----------------------------------+
バイナリリテラル
バイナリリテラルは、バイトシーケンス値を指定するために使用されます。
構文
X { 'num [ ... ]' | "num [ ... ]" }
パラメータ
-
num
0からFまでの任意の16進数。
例
SELECT X'123456' AS col;
+----------+
| col|
+----------+
|[12 34 56]|
+----------+
NULL リテラル
NULL リテラルは、NULL 値を指定するために使用されます。
構文
NULL
例
SELECT NULL AS col;
+----+
| col|
+----+
|NULL|
+----+
ブールリテラル
ブールリテラルは、ブール値を指定するために使用されます。
構文
TRUE | FALSE
例
SELECT TRUE AS col;
+----+
| col|
+----+
|true|
+----+
数値リテラル
数値リテラルは、固定小数点数または浮動小数点数を指定するために使用されます。数値リテラルには、整数リテラルと小数リテラルの2種類があります。
整数リテラル構文
[ + | - ] digit [ ... ] [ L | S | Y ]
整数リテラルパラメータ
-
digit
0から9までの任意の数字。
-
L
大文字小文字を区別しない、
BIGINT(8バイト符号付き整数)を示します。 -
S
大文字小文字を区別しない、
SMALLINT(2バイト符号付き整数)を示します。 -
Y
大文字小文字を区別しない、
TINYINT(1バイト符号付き整数)を示します。 -
デフォルト(サフィックスなし)
4バイト符号付き整数を示します。
整数リテラルの例
SELECT -2147483648 AS col;
+-----------+
| col|
+-----------+
|-2147483648|
+-----------+
SELECT 9223372036854775807l AS col;
+-------------------+
| col|
+-------------------+
|9223372036854775807|
+-------------------+
SELECT -32Y AS col;
+---+
|col|
+---+
|-32|
+---+
SELECT 482S AS col;
+---+
|col|
+---+
|482|
+---+
小数リテラル構文
decimal literals
decimal_digits { [ BD ] | [ exponent BD ] } | digit [ ... ] [ exponent ] BD
double literals
decimal_digits { D | exponent [ D ] } | digit [ ... ] { exponent [ D ] | [ exponent ] D }
float literals
decimal_digits { F | exponent [ F ] } | digit [ ... ] { exponent [ F ] | [ exponent ] F }
decimal_digits は次のように定義されています。
[ + | - ] { digit [ ... ] . [ digit [ ... ] ] | . digit [ ... ] }
exponent は次のように定義されています。
E [ + | - ] digit [ ... ]
小数リテラルパラメータ
-
digit
0から9までの任意の数字。
-
D
大文字小文字を区別しない、
DOUBLE(8バイト倍精度浮動小数点数)を示します。 -
F
大文字小文字を区別しない、
FLOAT(4バイト単精度浮動小数点数)を示します。 -
BD
大文字小文字を区別しない、
DECIMALを示します。精度は合計桁数、スケールは小数点以下の桁数です。
小数リテラルの例
SELECT 12.578 AS col, TYPEOF(12.578) AS type;
+------+------------+
| col| type|
+------+------------+
|12.578|decimal(5,3)|
+------+------------+
SELECT 12.578E0 AS col, TYPEOF(12.578E0) AS type;
+------+------+
| col| type|
+------+------+
|12.578|double|
+------+------+
SELECT -0.1234567 AS col;
+----------+
| col|
+----------+
|-0.1234567|
+----------+
SELECT -.1234567 AS col;
+----------+
| col|
+----------+
|-0.1234567|
+----------+
SELECT 123. AS col;
+---+
|col|
+---+
|123|
+---+
SELECT 123.BD AS col;
+---+
|col|
+---+
|123|
+---+
SELECT 5E2 AS col;
+-----+
| col|
+-----+
|500.0|
+-----+
SELECT 5D AS col;
+---+
|col|
+---+
|5.0|
+---+
SELECT -5BD AS col;
+---+
|col|
+---+
| -5|
+---+
SELECT 12.578e-2d AS col;
+-------+
| col|
+-------+
|0.12578|
+-------+
SELECT -.1234567E+2BD AS col;
+---------+
| col|
+---------+
|-12.34567|
+---------+
SELECT +3.e+3 AS col;
+------+
| col|
+------+
|3000.0|
+------+
SELECT -3.E-3D AS col;
+------+
| col|
+------+
|-0.003|
+------+
日時リテラル
日時リテラルは、日付またはタイムスタンプ値を指定するために使用されます。
日付構文
DATE { 'yyyy' |
'yyyy-[m]m' |
'yyyy-[m]m-[d]d' |
'yyyy-[m]m-[d]d[T]' }
注意: 月または日が指定されていない場合、デフォルトで 01 になります。
日付の例
SELECT DATE '1997' AS col;
+----------+
| col|
+----------+
|1997-01-01|
+----------+
SELECT DATE '1997-01' AS col;
+----------+
| col|
+----------+
|1997-01-01|
+----------+
SELECT DATE '2011-11-11' AS col;
+----------+
| col|
+----------+
|2011-11-11|
+----------+
タイムスタンプ構文
TIMESTAMP { 'yyyy' |
'yyyy-[m]m' |
'yyyy-[m]m-[d]d' |
'yyyy-[m]m-[d]d ' |
'yyyy-[m]m-[d]d[T][h]h[:]' |
'yyyy-[m]m-[d]d[T][h]h:[m]m[:]' |
'yyyy-[m]m-[d]d[T][h]h:[m]m:[s]s[.]' |
'yyyy-[m]m-[d]d[T][h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]'}
注意: 時、分、秒が指定されていない場合、デフォルトで 00 になります。zone_id は次のいずれかの形式である必要があります。
- Z - Zulu タイムゾーン UTC+0
+|-[h]h:[m]m- UTC+、UTC-、GMT+、GMT-、UT+、または UT- のいずれかのプレフィックスを持つ ID と、次の形式のサフィックス。
+|-h[h]+|-hh[:]mm+|-hh:mm:ss+|-hhmmss
- 地域ベースのゾーン ID の形式
area/city、例:Europe/Paris
注意: zone_id が指定されていない場合、セッションのローカルタイムゾーン(spark.sql.session.timeZone 経由で設定)がデフォルトになります。
タイムスタンプの例
SELECT TIMESTAMP '1997-01-31 09:26:56.123' AS col;
+-----------------------+
| col|
+-----------------------+
|1997-01-31 09:26:56.123|
+-----------------------+
SELECT TIMESTAMP '1997-01-31 09:26:56.66666666UTC+08:00' AS col;
+--------------------------+
| col |
+--------------------------+
|1997-01-30 17:26:56.666666|
+--------------------------+
SELECT TIMESTAMP '1997-01' AS col;
+-------------------+
| col|
+-------------------+
|1997-01-01 00:00:00|
+-------------------+
間隔リテラル
間隔リテラルは、固定された時間の期間を指定するために使用されます。間隔リテラルは、ANSI 構文とマルチユニット構文の2つの構文をサポートしています。
ANSI 構文
ANSI SQL 標準では、間隔リテラルを次の形式で定義しています。
INTERVAL [ <sign> ] <interval string> <interval qualifier>
ここで、<interval qualifier> は単一フィールドまたはフィールド間形式のいずれかになります。
<interval qualifier> ::= <start field> TO <end field> | <single field>
フィールド名は大文字小文字を区別せず、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND のいずれかです。
間隔リテラルは、年-月間隔または日-時間間隔のいずれかの型を持つことができます。間隔サブタイプは、<interval string> の形式を定義します。
<interval string> ::= <quote> [ <sign> ] { <year-month literal> | <day-time literal> } <quote>
<year-month literal> ::= <years value> [ <minus sign> <months value> ] | <months value>
<day-time literal> ::= <day-time interval> | <time interval>
<day-time interval> ::= <days value> [ <space> <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ] ]
<time interval> ::= <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ]
| <minutes value> [ <colon> <seconds value> ]
| <seconds value>
サポートされている年-月間隔リテラルとその形式
<interval qualifier> |
間隔文字列パターン | リテラルのインスタンス |
|---|---|---|
| YEAR | [+|-]'[+|-]y' |
INTERVAL -'2021' YEAR |
| YEAR TO MONTH | [+|-]'[+|-]y-m' |
INTERVAL '-2021-07' YEAR TO MONTH |
| MONTH | [+|-]'[+|-]m' |
interval '10' month |
サポートされている日-時間間隔リテラルの形式
<interval qualifier> |
間隔文字列パターン | リテラルのインスタンス |
|---|---|---|
| DAY | [+|-]'[+|-]d' |
INTERVAL -'100' DAY |
| DAY TO HOUR | [+|-]'[+|-]d h' |
INTERVAL '-100 10' DAY TO HOUR |
| DAY TO MINUTE | [+|-]'[+|-]d h:m' |
INTERVAL '100 10:30' DAY TO MINUTE |
| DAY TO SECOND | [+|-]'[+|-]d h:m:s.n' |
INTERVAL '100 10:30:40.999999' DAY TO SECOND |
| HOUR | [+|-]'[+|-]h' |
INTERVAL '123' HOUR |
| HOUR TO MINUTE | [+|-]'[+|-]h:m' |
INTERVAL -'-123:10' HOUR TO MINUTE |
| HOUR TO SECOND | [+|-]'[+|-]h:m:s.n' |
INTERVAL '123:10:59' HOUR TO SECOND |
| MINUTE | [+|-]'[+|-]m' |
interval '1000' minute |
| MINUTE TO SECOND | [+|-]'[+|-]m:s.n' |
INTERVAL '1000:01.001' MINUTE TO SECOND |
| SECOND | [+|-]'[+|-]s.n' |
INTERVAL '1000.000001' SECOND |
ANSI の例
SELECT INTERVAL '2-3' YEAR TO MONTH AS col;
+----------------------------+
|col |
+----------------------------+
|INTERVAL '2-3' YEAR TO MONTH|
+----------------------------+
SELECT INTERVAL -'20 15:40:32.99899999' DAY TO SECOND AS col;
+--------------------------------------------+
|col |
+--------------------------------------------+
|INTERVAL '-20 15:40:32.998999' DAY TO SECOND|
+--------------------------------------------+
マルチユニット構文
INTERVAL interval_value interval_unit [ interval_value interval_unit ... ] |
INTERVAL 'interval_value interval_unit [ interval_value interval_unit ... ]' |
マルチユニットパラメータ
-
interval_value
構文
[ + | - ] number_value | '[ + | - ] number_value' -
interval_unit
構文
YEAR[S] | MONTH[S] | WEEK[S] | DAY[S] | HOUR[S] | MINUTE[S] | SECOND[S] | MILLISECOND[S] | MICROSECOND[S] Mix of the YEAR[S] or MONTH[S] interval units with other units is not allowed.
マルチユニットの例
SELECT INTERVAL 3 YEAR AS col;
+-------+
| col|
+-------+
|3 years|
+-------+
SELECT INTERVAL -2 HOUR '3' MINUTE AS col;
+--------------------+
| col|
+--------------------+
|-1 hours -57 minutes|
+--------------------+
SELECT INTERVAL '1 YEAR 2 DAYS 3 HOURS';
+----------------------+
| col|
+----------------------+
|1 years 2 days 3 hours|
+----------------------+
SELECT INTERVAL 1 YEARS 2 MONTH 3 WEEK 4 DAYS 5 HOUR 6 MINUTES 7 SECOND 8
MILLISECOND 9 MICROSECONDS AS col;
+-----------------------------------------------------------+
| col|
+-----------------------------------------------------------+
|1 years 2 months 25 days 5 hours 6 minutes 7.008009 seconds|
+-----------------------------------------------------------+