データの種類
サポートされるデータ型
Spark SQL と DataFrames は以下のデータタイプをサポートします:
- 数値タイプ
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
の文字列値を返します。文字型の列の比較では、短いものから長いものへと埋め込まれます。
- バイナリタイプ
BinaryType
: バイトシーケンス値を表します。
- 真偽タイプ
BooleanType
: 真偽値を表します。
- 日付タイプ
TimestampType
: 年、月、日、時、分、秒のフィールドの値を構成する値を、セッションのローカルタイムゾーンで表します。タイムスタンプ値は絶対的な時点を表します。DateType
: 年、月、日のフィールドの値を構成する値を、タイムゾーン無しで表します。
- 間隔型
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' YEAR
YearMonthIntervalType(YEAR, MONTH)
INTERVAL YEAR TO MONTH INTERVAL '2021-07' YEAR TO MONTH
YearMonthIntervalType(MONTH, MONTH)
またはYearMonthIntervalType(MONTH)
INTERVAL MONTH INTERVAL '10' MONTH
- MONTH, 年内の月
DayTimeIntervalType(startField, endField)
: 次のフィールドの連続したサブセットで構成される日時間の間隔を表します。- SECOND, 分内の秒と1秒の端数
[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' DAY
DayTimeIntervalType(DAY, HOUR)
INTERVAL DAY TO HOUR INTERVAL '100 10' DAY TO HOUR
DayTimeIntervalType(DAY, MINUTE)
INTERVAL DAY TO MINUTE INTERVAL '100 10:30' DAY TO MINUTE
DayTimeIntervalType(DAY, SECOND)
INTERVAL DAY TO SECOND INTERVAL '100 10:30:40.999999' DAY TO SECOND
DayTimeIntervalType(HOUR, HOUR)
またはDayTimeIntervalType(HOUR)
INTERVAL HOUR INTERVAL '123' HOUR
DayTimeIntervalType(HOUR, MINUTE)
INTERVAL HOUR TO MINUTE INTERVAL '123:10' HOUR TO MINUTE
DayTimeIntervalType(HOUR, SECOND)
INTERVAL HOUR TO SECOND INTERVAL '123:10:59' HOUR TO SECOND
DayTimeIntervalType(MINUTE, MINUTE)
またはDayTimeIntervalType(MINUTE)
INTERVAL MINUTE INTERVAL '1000' MINUTE
DayTimeIntervalType(MINUTE, SECOND)
INTERVAL MINUTE TO SECOND INTERVAL '1000:01.001' MINUTE TO SECOND
DayTimeIntervalType(SECOND, SECOND)
またはDayTimeIntervalType(SECOND)
INTERVAL SECOND INTERVAL '1000.000001' SECOND
- SECOND, 分内の秒と1秒の端数
- 複雑なタイプ
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の全てのデータタイプは 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 | 文字列 | StringType |
BinaryType | Array[Byte] | BinaryType |
BooleanType | 真偽値 | BooleanType |
TimestampType | java.sql.Timestamp | TimestampType |
DateType | 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 の Seq です。また、同じ名前の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 あるいは Byte | DataTypes.ByteType |
ShortType | short あるいは Short | DataTypes.ShortType |
IntegerType | int あるいは Integer | DataTypes.IntegerType |
LongType | long あるいは Long | DataTypes.LongType |
FloatType | float あるいは Float | DataTypes.FloatType |
DoubleType | double あるいは Double | DataTypes.DoubleType |
DecimalType | java.math.BigDecimal | DataTypes.createDecimalType() DataTypes.createDecimalType(precision, scale). |
StringType | 文字列 | DataTypes.StringType |
BinaryType | byte[] | DataTypes.BinaryType |
BooleanType | boolean あるいは Boolean | DataTypes.BooleanType |
TimestampType | java.sql.Timestamp | DataTypes.TimestampType |
DateType | java.sql.Date | DataTypes.DateType |
YearMonthIntervalType | java.time.Period | YearMonthIntervalType |
DayTimeIntervalType | java.time.Duration | 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 は List あるいは StructFields の配列です。また、おなじ名前は許されません。 |
StructField | このフィールドのデータタイプのJavaでの値のタイプ(例えば、データタイプ IntegerTypeのStructFieldのためのint) | DataTypes.createStructField(name, dataType, nullable) |
Spark SQLの全てのデータタイプは pyspark.sql.types
パッケージ内にあります。以下のようにしてアクセスすることができます
データタイプ | Pythonでの値タイプ | データタイプにアクセスあるいは生成するためのAPI |
---|---|---|
ByteType | int or long 注意: 実行時に数値は1バイトの符号あり数値に変換されるでしょう。数値は-128から127の範囲にあるようにしてください。 |
ByteType() |
ShortType | int or long 注意: 実行時に数値は2バイトの符号あり数値に変換されるでしょう。数値は-32768から32767の範囲にあるようにしてください。 |
ShortType() |
IntegerType | int あるいは long | IntegerType() |
LongType | long 注意: 実行時に数値は8バイトの符号あり数値に変換されるでしょう。数値が-9223372036854775808から9223372036854775807の範囲内にあることを確認してください。それ以外の場合は、データをdecimal.Decimalに変換し、DecimalTypeを使用してください。 |
LongType() |
FloatType | float 注意: 実行時に数値は4バイトの符号あり単精度浮動小数点に変換されるでしょう。 |
FloatType() |
DoubleType | float | DoubleType() |
DecimalType | decimal.Decimal | DecimalType() |
StringType | 文字列 | StringType() |
BinaryType | bytearray | BinaryType() |
BooleanType | bool | BooleanType() |
TimestampType | datetime.datetime | TimestampType() |
DateType | datetime.date | DateType() |
ArrayType | リスト、組、あるいは配列 | ArrayType(elementType, [containsNull]) 注意: containsNull のデフォルト値は true です。 |
MapType | dict | MapType(keyType, valueType, [valueContainsNull]) 注意: valueContainsNull のデフォルト値は true です。 |
StructType | リストあるいは組 | StructType(fields) 注意: fields は StructFields の Seq です。また、同じ名前の2つのフィールドは許されません。 |
StructField | このフィールドのデータ型の Python での値の型 (例えば、データタイプ IntegerType の StructField のための Int) |
StructField(name, dataType, [nullable]) 注意: nullable のデフォルト値は true です。 |
データタイプ | 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 | “date” |
ArrayType | vector あるいは list | list(type=”array”, elementType=elementType, containsNull=[containsNull]) 注意: containsNull のデフォルト値は TRUE です。 |
MapType | environment | list(type=”map”, keyType=keyType, valueType=valueType, valueContainsNull=[valueContainsNull]) 注意: valueContainsNull のデフォルト値は TRUE です。 |
StructType | 名前付きリスト | list(type=”struct”, fields=fields) 注意: fields は StructFields の Seq です。また、同じ名前の2つのフィールドは許されません。 |
StructField | このフィールドのデータタイプのRでの値のタイプ(例えば、データタイプIntegerTypeのStructFieldのためのinteger) | list(name=name, type=dataType, nullable=[nullable]) 注意: nullable のデフォルト値は TRUE です。 |
以下の表は、各データ型の Spark SQL パーサで使われる型名と、エイリアスを示しています。
データタイプ | SQL name |
---|---|
BooleanType | BOOLEAN |
ByteType | BYTE, TINYINT |
ShortType | SHORT, SMALLINT |
IntegerType | INT, INTEGER |
LongType | LONG, BIGINT |
FloatType | FLOAT, REAL |
DoubleType | DOUBLE |
DateType | DATE |
TimestampType | TIMESTAMP |
StringType | STRING |
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, …> Note: ‘:’ is optional. |
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
タイプを扱う時に、not-a-number (NAN)の特別な処理があります。具体的には:
- NaN = NaN は true を返します。
- 集約の場合、全てのNaNの値は一緒にグループ化されます。
- NaN はjoinキー内での通常の値として扱われます。
- 昇順の場合、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'));
INSERT INTO test VALUES (2, double('infinity'));
INSERT INTO test VALUES (3, double('inf'));
INSERT INTO test VALUES (4, double('-inf'));
INSERT INTO test VALUES (5, double('NaN'));
INSERT INTO test VALUES (6, double('NaN'));
INSERT INTO test VALUES (7, double('-infinity'));
SELECT COUNT(*), c2 FROM test GROUP BY c2;
+---------+---------+
| count(1)| c2|
+---------+---------+
| 2| NaN|
| 2|-Infinity|
| 3| Infinity|
+---------+---------+