数据类型
支持的数据类型
Spark SQL 和 DataFrames 支持以下数据类型
- 数值类型
ByteType
: 表示 1 字节有符号整数。数字范围从-128
到127
。ShortType
: 表示 2 字节有符号整数。数字范围从-32768
到32767
。IntegerType
: 表示 4 字节有符号整数。数字范围从-2147483648
到2147483647
。LongType
: 表示 8 字节有符号整数。数字范围从-9223372036854775808
到9223372036854775807
。FloatType
: 表示 4 字节单精度浮点数。DoubleType
: 表示 8 字节双精度浮点数。DecimalType
: 表示任意精度有符号十进制数。内部由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
s (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, or array (列表,元组或数组) | ArrayType(elementType, [containsNull]) 注意:containsNull 的默认值为 True。 |
MapType | dict | MapType(keyType, valueType, [valueContainsNull]) 注意:valueContainsNull 的默认值为 True。 |
StructType | list or tuple (列表或元组) | StructType(fields) 注意: fields 是 StructField 的 Seq。此外,不允许使用相同名称的两个字段。 |
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 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 是 StructField 的 Seq。此外,不允许使用相同名称的两个字段。 |
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 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 是 StructField 的 List 或数组。此外,不允许使用相同名称的两个字段。 |
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 是 StructField 的 Seq。此外,不允许使用相同名称的两个字段。 |
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|
+---------+---------+