データ型
サポートされているデータ型
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
の文字列値が返されます。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' 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、分内の秒、および可能性のある秒の小数部
[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、分内の秒、および可能性のある秒の小数部
- 複合型
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 または long 注:数値は実行時に1バイトの符号付き整数に変換されます。数値が-128〜127の範囲内であることを確認してください。 |
ByteType() |
ShortType | int または 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 | string | StringType() |
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、または array | ArrayType(elementType, [containsNull]) 注:containsNullのデフォルト値はTrueです。 |
MapType | dict | MapType(keyType, valueType, [valueContainsNull]) 注:valueContainsNullのデフォルト値はTrueです。 |
StructType | list または tuple | StructType(fields) 注:fieldsはStructFieldsのSeqです。また、同じ名前の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 |
BinaryType | Array[Byte] | BinaryType |
BooleanType | Boolean | BooleanType |
TimestampType | java.time.Instant または java.sql.Timestamp | TimestampType |
TimestampNTZType | java.time.LocalDateTime | TimestampNTZType |
DateType | java.time.LocalDate または 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 | String | DataTypes.StringType |
BinaryType | byte[] | DataTypes.BinaryType |
BooleanType | boolean または Boolean | DataTypes.BooleanType |
TimestampType | java.time.Instant または java.sql.Timestamp | DataTypes.TimestampType |
TimestampNTZType | java.time.LocalDateTime | DataTypes.TimestampNTZType |
DateType | java.time.LocalDate または 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のリストまたは配列です。また、同じ名前の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 | “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 | named list | 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名 |
---|---|
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 |
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
:ScalaFloat.PositiveInfinity
と同等。DoubleType
:ScalaDouble.PositiveInfinity
と同等。
- -Inf/-Infinity:負の無限大
FloatType
:ScalaFloat.NegativeInfinity
と同等。DoubleType
:ScalaDouble.NegativeInfinity
と同等。
- NaN:非数
FloatType
:ScalaFloat.NaN
と同等。DoubleType
:ScalaDouble.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'));
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|
+---------+---------+