データ型

サポートされているデータ型

Spark SQL および DataFrames は、次のデータ型をサポートしています。

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._
完全なサンプルコードは、Sparkリポジトリの"examples/src/main/scala/org/apache/spark/examples/sql/SparkSQLExample.scala"にあります。
データ型 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では、大文字と小文字を区別せずにいくつかの特殊な浮動小数点数値をサポートしています

正/負の無限大のセマンティクス

正と負の無限大には特別な処理があります。それらには次のセマンティクスがあります

NaNセマンティクス

標準の浮動小数点セマンティクスと完全に一致しないfloatまたはdouble型を扱う場合、非数(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|
+---------+---------+