データ型
サポートされているデータ型
Spark SQL および DataFrame は、以下のデータ型をサポートしています。
- 数値型
ByteType: 1 バイト符号付き整数を表します。数値の範囲は-128から127です。ShortType: 2 バイト符号付き整数を表します。数値の範囲は-32768から32767です。IntegerType: 4 バイト符号付き整数を表します。数値の範囲は-2147483648から2147483647です。LongType: 8 バイト符号付き整数を表します。数値の範囲は-9223372036854775808から9223372036854775807です。FloatType: 4 バイト単精度浮動小数点数を表します。DoubleType: 8 バイト倍精度浮動小数点数を表します。DecimalType: 任意精度の符号付き10進数を表します。内部的にはjava.math.BigDecimalを使用します。BigDecimalは、任意精度の整数(アンスケーリング値)と 32 ビット整数のスケールで構成されます。
- 文字列型
StringType: 文字列値を表します。VarcharType(length): 長さに制限があるStringTypeのバリアントです。入力文字列が長さ制限を超えている場合、データの書き込みは失敗します。注: この型はテーブルスキーマでのみ使用でき、関数や演算子では使用できません。CharType(length): 固定長のVarcharType(length)のバリアントです。CharType(n)型の列を読み取ると、常に長さnの文字列値が返されます。Char 型の列の比較では、短い方が長い方にパディングされます。
- バイナリ型
BinaryType: バイトシーケンス値を表します。
- ブール型
BooleanType: ブール値を表します。
- 日付/時刻型
DateType: 年、月、日のフィールド値で構成される値を表します。タイムゾーンはありません。TimestampType: ローカルタイムゾーン付きタイムスタンプ (TIMESTAMP_LTZ)。年、月、日、時、分、秒のフィールド値とセッションのローカルタイムゾーンで構成される値を表します。タイムスタンプ値は絶対的な時点を表します。TimestampNTZType: タイムゾーンなしタイムスタンプ (TIMESTAMP_NTZ)。年、月、日、時、分、秒のフィールド値で構成される値を表します。すべての操作は、タイムゾーンを考慮せずに行われます。- 注: Spark の TIMESTAMP は、TIMESTAMP_LTZ および TIMESTAMP_NTZ のバリアントのいずれかに関連付けられたユーザー指定のエイリアスです。ユーザーは、設定
spark.sql.timestampTypeを介して、デフォルトのタイムスタンプ型をTIMESTAMP_LTZ(デフォルト値)またはTIMESTAMP_NTZに設定できます。
- 注: Spark の TIMESTAMP は、TIMESTAMP_LTZ および TIMESTAMP_NTZ のバリアントのいずれかに関連付けられたユーザー指定のエイリアスです。ユーザーは、設定
- 間隔型
YearMonthIntervalType(startField, endField): 年月間隔を表します。以下のフィールドの連続したサブセットで構成されます。- MONTH、年内の月
[0..11]、 - YEAR、年の範囲
[0..178956970]。
個々の間隔フィールドは非負ですが、間隔自体は符号を持つことができ、負になることもあります。
startFieldは最も左のフィールド、endFieldは最も右のフィールドです。startFieldおよびendFieldの有効な値は 0 (MONTH) および 1 (YEAR) です。サポートされている年月間隔型は以下のとおりです。年月間隔型 SQL 型 型のインスタンス YearMonthIntervalType(YEAR, YEAR)またはYearMonthIntervalType(YEAR)INTERVAL YEAR INTERVAL '2021' YEARYearMonthIntervalType(YEAR, MONTH)INTERVAL YEAR TO MONTH INTERVAL '2021-07' YEAR TO MONTHYearMonthIntervalType(MONTH, MONTH)またはYearMonthIntervalType(MONTH)INTERVAL MONTH INTERVAL '10' MONTH- MONTH、年内の月
DayTimeIntervalType(startField, endField): 日時間隔を表します。以下のフィールドの連続したサブセットで構成されます。- SECOND、分内の秒および秒の小数部
[0..59.999999]、 - MINUTE、時間内の分
[0..59]、 - HOUR、日内の時間
[0..23]、 - DAY、日の範囲
[0..106751991]。
個々の間隔フィールドは非負ですが、間隔自体は符号を持つことができ、負になることもあります。
startFieldは最も左のフィールド、endFieldは最も右のフィールドです。startFieldおよびendFieldの有効な値は 0 (DAY)、1 (HOUR)、2 (MINUTE)、3 (SECOND) です。サポートされている日時間隔型は以下のとおりです。日時間隔型 SQL 型 型のインスタンス DayTimeIntervalType(DAY, DAY)またはDayTimeIntervalType(DAY)INTERVAL DAY INTERVAL '100' DAYDayTimeIntervalType(DAY, HOUR)INTERVAL DAY TO HOUR INTERVAL '100 10' DAY TO HOURDayTimeIntervalType(DAY, MINUTE)INTERVAL DAY TO MINUTE INTERVAL '100 10:30' DAY TO MINUTEDayTimeIntervalType(DAY, SECOND)INTERVAL DAY TO SECOND INTERVAL '100 10:30:40.999999' DAY TO SECONDDayTimeIntervalType(HOUR, HOUR)またはDayTimeIntervalType(HOUR)INTERVAL HOUR INTERVAL '123' HOURDayTimeIntervalType(HOUR, MINUTE)INTERVAL HOUR TO MINUTE INTERVAL '123:10' HOUR TO MINUTEDayTimeIntervalType(HOUR, SECOND)INTERVAL HOUR TO SECOND INTERVAL '123:10:59' HOUR TO SECONDDayTimeIntervalType(MINUTE, MINUTE)またはDayTimeIntervalType(MINUTE)INTERVAL MINUTE INTERVAL '1000' MINUTEDayTimeIntervalType(MINUTE, SECOND)INTERVAL MINUTE TO SECOND INTERVAL '1000:01.001' MINUTE TO SECONDDayTimeIntervalType(SECOND, SECOND)またはDayTimeIntervalType(SECOND)INTERVAL SECOND INTERVAL '1000.000001' SECOND- SECOND、分内の秒および秒の小数部
- 複合型
ArrayType(elementType, containsNull):elementTypeの型を持つ要素のシーケンスで構成される値を表します。containsNullは、ArrayType値の要素にnull値を含めることができるかどうかを示すために使用されます。MapType(keyType, valueType, valueContainsNull): キーと値のペアのセットで構成される値を表します。キーのデータ型はkeyType、値のデータ型はvalueTypeによって記述されます。MapType値では、キーにnull値を含めることはできません。valueContainsNullは、MapType値の値にnull値を含めることができるかどうかを示すために使用されます。StructType(fields):StructField(fields)のシーケンスによって記述される構造を持つ値を表します。StructField(name, dataType, nullable):StructTypeのフィールドを表します。フィールドの名前はnameで示されます。フィールドのデータ型はdataTypeで示されます。nullableは、これらのフィールドの値にnull値を含めることができるかどうかを示すために使用されます。
Spark SQL のすべてのデータ型は、pyspark.sql.types パッケージにあります。次のようにアクセスできます。
from pyspark.sql.types import *| データ型 | Python での値の型 | データ型にアクセスまたは作成するための API |
|---|---|---|
| ByteType | int 注意: 数値は実行時に 1 バイト符号付き整数に変換されます。数値が -128 から 127 の範囲内にあることを確認してください。 |
ByteType() |
| ShortType | int 注意: 数値は実行時に 2 バイト符号付き整数に変換されます。数値が -32768 から 32767 の範囲内にあることを確認してください。 |
ShortType() |
| IntegerType | int | IntegerType() |
| LongType | int 注意: 数値は実行時に 8 バイト符号付き整数に変換されます。数値が -9223372036854775808 から 9223372036854775807 の範囲内にあることを確認してください。そうでない場合は、データを decimal.Decimal に変換して DecimalType を使用してください。 |
LongType() |
| FloatType | float 注意: 数値は実行時に 4 バイト単精度浮動小数点数に変換されます。 |
FloatType() |
| DoubleType | float | DoubleType() |
| DecimalType | decimal.Decimal | DecimalType() |
| StringType | str | StringType() |
| CharType(length) | str | CharType(length) |
| VarcharType(length) | str | VarcharType(length) |
| BinaryType | bytearray | BinaryType() |
| BooleanType | bool | BooleanType() |
| TimestampType | datetime.datetime | TimestampType() |
| TimestampNTZType | datetime.datetime | TimestampNTZType() |
| DateType | datetime.date | DateType() |
| DayTimeIntervalType | datetime.timedelta | DayTimeIntervalType() |
| ArrayType | list, tuple, or array | ArrayType(elementType, [containsNull]) 注意: containsNull のデフォルト値は True です。 |
| MapType | dict | MapType(keyType, valueType, [valueContainsNull]) 注意: valueContainsNull のデフォルト値は True です。 |
| StructType | list or tuple | StructType(fields) 注意: fields は StructFields のシーケンスです。また、同じ名前の 2 つのフィールドは許可されません。 |
| StructField | このフィールドのデータ型の Python での値の型 (例: IntegerType のデータ型を持つ StructField の Int) |
StructField(name, dataType, [nullable]) 注意: nullable のデフォルト値は True です。 |
Spark SQL のすべてのデータ型は、org.apache.spark.sql.types パッケージにあります。次のようにアクセスまたは作成できます。
import org.apache.spark.sql.types._| データ型 | Scala での値の型 | データ型にアクセスまたは作成するための API |
|---|---|---|
| ByteType | Byte | ByteType |
| ShortType | Short | ShortType |
| IntegerType | Int | IntegerType |
| LongType | Long | LongType |
| FloatType | Float | FloatType |
| DoubleType | Double | DoubleType |
| DecimalType | java.math.BigDecimal | DecimalType |
| StringType | String | StringType |
| CharType(length) | String | CharType(length) |
| VarcharType(length) | String | VarcharType(length) |
| BinaryType | Array[Byte] | BinaryType |
| BooleanType | Boolean | BooleanType |
| TimestampType | java.time.Instant or java.sql.Timestamp | TimestampType |
| TimestampNTZType | java.time.LocalDateTime | TimestampNTZType |
| DateType | java.time.LocalDate or java.sql.Date | DateType |
| YearMonthIntervalType | java.time.Period | YearMonthIntervalType |
| DayTimeIntervalType | java.time.Duration | DayTimeIntervalType |
| ArrayType | scala.collection.Seq | ArrayType(elementType, [containsNull]) 注意: containsNull のデフォルト値は true です。 |
| MapType | scala.collection.Map | MapType(keyType, valueType, [valueContainsNull]) 注意: valueContainsNull のデフォルト値は true です。 |
| StructType | org.apache.spark.sql.Row | StructType(fields) 注意: fields は StructFields のシーケンスです。また、同じ名前の 2 つのフィールドは許可されません。 |
| StructField | このフィールドのデータ型の Scala での値の型 (例: IntegerType のデータ型を持つ StructField の Int) | StructField(name, dataType, [nullable]) 注意: nullable のデフォルト値は true です。 |
Spark SQL のすべてのデータ型は、org.apache.spark.sql.types パッケージにあります。データ型にアクセスまたは作成するには、org.apache.spark.sql.types.DataTypes で提供されているファクトリメソッドを使用してください。
| データ型 | Java での値の型 | データ型にアクセスまたは作成するための API |
|---|---|---|
| ByteType | byte or Byte | DataTypes.ByteType |
| ShortType | short or Short | DataTypes.ShortType |
| IntegerType | int or Integer | DataTypes.IntegerType |
| LongType | long or Long | DataTypes.LongType |
| FloatType | float or Float | DataTypes.FloatType |
| DoubleType | double or Double | DataTypes.DoubleType |
| DecimalType | java.math.BigDecimal | DataTypes.createDecimalType() DataTypes.createDecimalType(precision, scale)。 |
| StringType | String | DataTypes.StringType |
| CharType(length) | String | DataTypes.createCharType(length) |
| VarcharType(length) | String | DataTypes.createVarcharType(length) |
| BinaryType | byte[] | DataTypes.BinaryType |
| BooleanType | boolean or Boolean | DataTypes.BooleanType |
| TimestampType | java.time.Instant or java.sql.Timestamp | DataTypes.TimestampType |
| TimestampNTZType | java.time.LocalDateTime | DataTypes.TimestampNTZType |
| DateType | java.time.LocalDate or java.sql.Date | DataTypes.DateType |
| YearMonthIntervalType | java.time.Period | DataTypes.YearMonthIntervalType |
| DayTimeIntervalType | java.time.Duration | DataTypes.DayTimeIntervalType |
| ArrayType | java.util.List | DataTypes.createArrayType(elementType) 注意: containsNull の値は true になります。 DataTypes.createArrayType(elementType, containsNull)。 |
| MapType | java.util.Map | DataTypes.createMapType(keyType, valueType) 注意: valueContainsNull の値は true になります。 DataTypes.createMapType(keyType, valueType, valueContainsNull) |
| StructType | org.apache.spark.sql.Row | DataTypes.createStructType(fields) 注意: fields は StructFields の List または配列です。また、同じ名前の 2 つのフィールドは許可されません。 |
| StructField | このフィールドのデータ型の Java での値の型 (例: IntegerType のデータ型を持つ StructField の int) | DataTypes.createStructField(name, dataType, nullable) |
| データ型 | R での値の型 | データ型にアクセスまたは作成するための API |
|---|---|---|
| ByteType | integer 注意: 数値は実行時に 1 バイト符号付き整数に変換されます。数値が -128 から 127 の範囲内にあることを確認してください。 |
“byte” |
| ShortType | integer 注意: 数値は実行時に 2 バイト符号付き整数に変換されます。数値が -32768 から 32767 の範囲内にあることを確認してください。 |
“short” |
| IntegerType | integer | “integer” |
| LongType | integer 注意: 数値は実行時に 8 バイト符号付き整数に変換されます。数値が -9223372036854775808 から 9223372036854775807 の範囲内にあることを確認してください。そうでない場合は、データを decimal.Decimal に変換して DecimalType を使用してください。 |
“long” |
| FloatType | numeric 注意: 数値は実行時に 4 バイト単精度浮動小数点数に変換されます。 |
“float” |
| DoubleType | numeric | “double” |
| DecimalType | サポートされていません | サポートされていません |
| StringType | character | “string” |
| BinaryType | raw | “binary” |
| BooleanType | logical | “bool” |
| TimestampType | POSIXct | “timestamp” |
| DateType | 日付 | “date” |
| ArrayType | vector or list | list(type=”array”, elementType=elementType, containsNull=[containsNull]) 注意: containsNull のデフォルト値は TRUE です。 |
| MapType | environment | list(type=”map”, keyType=keyType, valueType=valueType, valueContainsNull=[valueContainsNull]) 注意: valueContainsNull のデフォルト値は TRUE です。 |
| StructType | named list | list(type=”struct”, fields=fields) 注意: fields は StructFields のシーケンスです。また、同じ名前の 2 つのフィールドは許可されません。 |
| StructField | このフィールドのデータ型の R での値の型 (例: IntegerType のデータ型を持つ StructField の integer) | list(name=name, type=dataType, nullable=[nullable]) 注意: nullable のデフォルト値は TRUE です。 |
以下の表は、Spark SQL パーサーで使用される各データ型の型名およびエイリアスを示しています。
| データ型 | SQL 名 |
|---|---|
| BooleanType | BOOLEAN |
| ByteType | BYTE, TINYINT |
| ShortType | SHORT, SMALLINT |
| IntegerType | INT, INTEGER |
| LongType | LONG, BIGINT |
| FloatType | FLOAT, REAL |
| DoubleType | DOUBLE |
| DateType | DATE |
| TimestampType | TIMESTAMP, TIMESTAMP_LTZ |
| TimestampNTZType | TIMESTAMP_NTZ |
| StringType | STRING |
| CharType(length) | CHAR(length) |
| VarcharType(length) | VARCHAR(length) |
| BinaryType | BINARY |
| DecimalType | DECIMAL, DEC, NUMERIC |
| YearMonthIntervalType | INTERVAL YEAR, INTERVAL YEAR TO MONTH, INTERVAL MONTH |
| DayTimeIntervalType | INTERVAL DAY, INTERVAL DAY TO HOUR, INTERVAL DAY TO MINUTE, INTERVAL DAY TO SECOND, INTERVAL HOUR, INTERVAL HOUR TO MINUTE, INTERVAL HOUR TO SECOND, INTERVAL MINUTE, INTERVAL MINUTE TO SECOND, INTERVAL SECOND |
| ArrayType | ARRAY<element_type> |
| StructType | STRUCT<field1_name: field1_type, field2_name: field2_type, …> 注意: 「:」はオプションです。 |
| MapType | MAP<key_type, value_type> |
浮動小数点特殊値
Spark SQL は、大文字/小文字を区別せずに、いくつかの特殊な浮動小数点値をサポートしています。
- Inf/+Inf/Infinity/+Infinity: 正の無限大
FloatType: Scala のFloat.PositiveInfinityに相当します。DoubleType: Scala のDouble.PositiveInfinityに相当します。
- -Inf/-Infinity: 負の無限大
FloatType: Scala のFloat.NegativeInfinityに相当します。DoubleType: Scala のDouble.NegativeInfinityに相当します。
- NaN: 非数
FloatType: Scala のFloat.NaNに相当します。DoubleType: Scala のDouble.NaNに相当します。
正/負の無限大のセマンティクス
正の無限大と負の無限大には特別な処理があります。それらは以下のセマンティクスを持ちます。
- 正の無限大に正の値を掛けると、正の無限大が返されます。
- 負の無限大に正の値を掛けると、負の無限大が返されます。
- 正の無限大に負の値を掛けると、負の無限大が返されます。
- 負の無限大に負の値を掛けると、正の無限大が返されます。
- 正/負の無限大に 0 を掛けると NaN が返されます。
- 正の無限大と負の無限大は、それ自体と等しいです。
- 集計では、すべての正の無限大の値は一緒にグループ化されます。同様に、すべての負の無限大の値は一緒にグループ化されます。
- 正の無限大と負の無限大は、結合キーでは通常の値をとして扱われます。
- 正の無限大は NaN より低く、他のすべての値より高くソートされます。
- 負の無限大は、他のすべての値より低くソートされます。
NaN のセマンティクス
標準の浮動小数点セマンティクスと正確に一致しない float または double 型を扱う場合、非数 (NaN) の特別な処理があります。具体的には次のようになります。
- NaN = NaN は true を返します。
- 集計では、すべての NaN 値は一緒にグループ化されます。
- NaN は、結合キーでは通常の値をとして扱われます。
- NaN 値は、昇順で最後になり、他のすべての数値よりも大きくなります。
例
SELECT double('infinity') AS col;
+--------+
| col|
+--------+
|Infinity|
+--------+
SELECT float('-inf') AS col;
+---------+
| col|
+---------+
|-Infinity|
+---------+
SELECT float('NaN') AS col;
+---+
|col|
+---+
|NaN|
+---+
SELECT double('infinity') * 0 AS col;
+---+
|col|
+---+
|NaN|
+---+
SELECT double('-infinity') * (-1234567) AS col;
+--------+
| col|
+--------+
|Infinity|
+--------+
SELECT double('infinity') < double('NaN') AS col;
+----+
| col|
+----+
|true|
+----+
SELECT double('NaN') = double('NaN') AS col;
+----+
| col|
+----+
|true|
+----+
SELECT double('inf') = double('infinity') AS col;
+----+
| col|
+----+
|true|
+----+
CREATE TABLE test (c1 int, c2 double);
INSERT INTO test VALUES
(1, double('infinity')),
(2, double('infinity')),
(3, double('inf')),
(4, double('-inf')),
(5, double('NaN')),
(6, double('NaN')),
(7, double('-infinity'))
;
SELECT COUNT(*), c2
FROM test
GROUP BY c2
ORDER BY c2;
+---------+---------+
| count(1)| c2|
+---------+---------+
| 2|-Infinity|
| 3| Infinity|
| 2| NaN|
+---------+---------+