数据类型
支持的数据类型
Spark SQL 和 DataFrame 支持以下数据类型
- 数值类型
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
: 带有本地时区的 timestamps(TIMESTAMP_LTZ)。它表示包含年份、月份、日期、小时、分钟和秒值的字段,以及会话本地时区。时间戳值表示时间中的一个绝对点。TimestampNTZType
: 不带时区的 timestamps(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
包中。您可以通过以下方式访问它们
数据类型 | Python 中的值类型 | 访问或创建数据类型的 API |
---|---|---|
字节类型 | int 或 long 注意:数字将在运行时转换为 1 字节有符号整数。请确保数字在 -128 到 127 的范围内。 |
ByteType() |
短整型 | int 或 long 注意:数字将在运行时转换为 2 字节有符号整数。请确保数字在 -32768 到 32767 的范围内。 |
ShortType() |
整型 | int 或 long | IntegerType() |
长整型 | long 注意:数字将在运行时转换为 8 字节有符号整数。请确保数字在 -9223372036854775808 到 9223372036854775807 的范围内。否则,请将数据转换为 decimal.Decimal 并使用 DecimalType。 |
LongType() |
浮点型 | float 注意:数字将在运行时转换为 4 字节单精度浮点数。 |
FloatType() |
双精度型 | float | DoubleType() |
十进制类型 | decimal.Decimal | DecimalType() |
字符串类型 | string | StringType() |
二进制类型 | bytearray | BinaryType() |
布尔类型 | bool | BooleanType() |
时间戳类型 | datetime.datetime | TimestampType() |
无时区时间戳类型 | datetime.datetime | TimestampNTZType() |
日期类型 | datetime.date | DateType() |
天时间间隔类型 | datetime.timedelta | DayTimeIntervalType() |
数组类型 | list、tuple 或 array | ArrayType(elementType, [containsNull]) 注意:containsNull 的默认值为 True。 |
映射类型 | dict | MapType(keyType, valueType, [valueContainsNull]) 注意:valueContainsNull 的默认值为 True。 |
结构类型 | list 或 tuple | StructType(fields) 注意:fields 是 StructFields 的 Seq。此外,不允许两个具有相同名称的字段。 |
结构字段 | 此字段数据类型的 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 |
---|---|---|
字节类型 | Byte | 字节类型 |
短整型 | Short | 短整型 |
整型 | Int | 整型 |
长整型 | Long | 长整型 |
浮点型 | Float | 浮点型 |
双精度型 | Double | 双精度型 |
十进制类型 | java.math.BigDecimal | 十进制类型 |
字符串类型 | String | 字符串类型 |
二进制类型 | Array[Byte] | 二进制类型 |
布尔类型 | Boolean | 布尔类型 |
时间戳类型 | java.time.Instant 或 java.sql.Timestamp | 时间戳类型 |
无时区时间戳类型 | java.time.LocalDateTime | 无时区时间戳类型 |
日期类型 | java.time.LocalDate 或 java.sql.Date | 日期类型 |
YearMonthIntervalType | java.time.Period | YearMonthIntervalType |
天时间间隔类型 | java.time.Duration | 天时间间隔类型 |
数组类型 | scala.collection.Seq | ArrayType(elementType, [containsNull]) 注意:containsNull 的默认值为 true。 |
映射类型 | scala.collection.Map | MapType(keyType, valueType, [valueContainsNull]) 注意:valueContainsNull 的默认值为 true。 |
结构类型 | org.apache.spark.sql.Row | StructType(fields) 注意:fields 是 StructFields 的 Seq。此外,不允许两个具有相同名称的字段。 |
结构字段 | 此字段数据类型的 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 |
---|---|---|
字节类型 | byte 或 Byte | DataTypes.ByteType |
短整型 | short 或 Short | DataTypes.ShortType |
整型 | int 或 Integer | DataTypes.IntegerType |
长整型 | long 或 Long | DataTypes.LongType |
浮点型 | float 或 Float | DataTypes.FloatType |
双精度型 | double 或 Double | DataTypes.DoubleType |
十进制类型 | java.math.BigDecimal | DataTypes.createDecimalType() DataTypes.createDecimalType(precision, scale). |
字符串类型 | String | DataTypes.StringType |
二进制类型 | byte[] | DataTypes.BinaryType |
布尔类型 | boolean 或 Boolean | DataTypes.BooleanType |
时间戳类型 | java.time.Instant 或 java.sql.Timestamp | DataTypes.TimestampType |
无时区时间戳类型 | java.time.LocalDateTime | DataTypes.TimestampNTZType |
日期类型 | java.time.LocalDate 或 java.sql.Date | DataTypes.DateType |
YearMonthIntervalType | java.time.Period | DataTypes.YearMonthIntervalType |
天时间间隔类型 | java.time.Duration | DataTypes.DayTimeIntervalType |
数组类型 | java.util.List | DataTypes.createArrayType(elementType) 注意:containsNull 的值为 true。 DataTypes.createArrayType(elementType, containsNull). |
映射类型 | java.util.Map | DataTypes.createMapType(keyType, valueType) 注意:valueContainsNull 的值为 true。 DataTypes.createMapType(keyType, valueType, valueContainsNull) |
结构类型 | org.apache.spark.sql.Row | DataTypes.createStructType(fields) 注意:fields 是 StructFields 的 List 或数组。此外,不允许两个具有相同名称的字段。 |
结构字段 | 此字段数据类型的 Java 值类型(例如,对于数据类型为 IntegerType 的 StructField,则为 int) | DataTypes.createStructField(name, dataType, nullable) |
数据类型 | R 中的值类型 | 访问或创建数据类型的 API |
---|---|---|
字节类型 | integer 注意:数字将在运行时转换为 1 字节有符号整数。请确保数字在 -128 到 127 的范围内。 |
“byte” |
短整型 | integer 注意:数字将在运行时转换为 2 字节有符号整数。请确保数字在 -32768 到 32767 的范围内。 |
“short” |
整型 | integer | “integer” |
长整型 | integer 注意:数字将在运行时转换为 8 字节有符号整数。请确保数字在 -9223372036854775808 到 9223372036854775807 的范围内。否则,请将数据转换为 decimal.Decimal 并使用 DecimalType。 |
“long” |
浮点型 | numeric 注意:数字将在运行时转换为 4 字节单精度浮点数。 |
“float” |
双精度型 | numeric | “double” |
十进制类型 | 不支持 | 不支持 |
字符串类型 | character | “string” |
二进制类型 | raw | “binary” |
布尔类型 | logical | “bool” |
时间戳类型 | POSIXct | “timestamp” |
日期类型 | Date | “date” |
数组类型 | vector 或 list | list(type=”array”, elementType=elementType, containsNull=[containsNull]) 注意:containsNull 的默认值为 TRUE。 |
映射类型 | environment | list(type=”map”, keyType=keyType, valueType=valueType, valueContainsNull=[valueContainsNull]) 注意:valueContainsNull 的默认值为 TRUE。 |
结构类型 | named list | list(type=”struct”, fields=fields) 注意:fields 是 StructFields 的 Seq。此外,不允许两个具有相同名称的字段。 |
结构字段 | 此字段数据类型的 R 值类型(例如,对于数据类型为 IntegerType 的 StructField,则为 integer) | list(name=name, type=dataType, nullable=[nullable]) 注意:nullable 的默认值为 TRUE。 |
下表显示了 Spark SQL 解析器中每个数据类型使用的类型名称以及别名。
数据类型 | SQL 名称 |
---|---|
布尔类型 | BOOLEAN |
字节类型 | BYTE, TINYINT |
短整型 | SHORT, SMALLINT |
整型 | INT, INTEGER |
长整型 | LONG, BIGINT |
浮点型 | FLOAT, REAL |
双精度型 | DOUBLE |
日期类型 | DATE |
时间戳类型 | TIMESTAMP, TIMESTAMP_LTZ |
无时区时间戳类型 | TIMESTAMP_NTZ |
字符串类型 | STRING |
二进制类型 | BINARY |
十进制类型 | DECIMAL, DEC, NUMERIC |
YearMonthIntervalType | INTERVAL YEAR, INTERVAL YEAR TO MONTH, INTERVAL MONTH |
天时间间隔类型 | 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 |
数组类型 | ARRAY<element_type> |
结构类型 | STRUCT<field1_name: field1_type, field2_name: field2_type, …> 注意:‘:’ 是可选的。 |
映射类型 | 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|
+---------+---------+