数据类型
支持的数据类型
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
(fields
) 描述的值。StructField(name, dataType, nullable)
: 表示StructType
中的一个字段。字段名称由name
指示。字段的数据类型由dataType
指示。nullable
用于指示这些字段的值是否可以包含null
值。
Spark SQL 的所有数据类型都位于 pyspark.sql.types
包中。您可以通过以下方式访问它们
from pyspark.sql.types import *
数据类型 | Python 中的值类型 | 访问或创建数据类型的 API |
---|---|---|
ByteType | int 注意:数字将在运行时转换为 1 字节有符号整数。请确保数字在 -128 到 127 之间。 |
ByteType() |
ShortType | int 注意:数字将在运行时转换为 2 字节有符号整数。请确保数字在 -32768 到 32767 之间。 |
ShortType() |
IntegerType | int | IntegerType() |
LongType | int 注意:数字将在运行时转换为 8 字节有符号整数。请确保数字在 -9223372036854775808 到 9223372036854775807 之间。否则,请将数据转换为 decimal.Decimal 并使用 DecimalType。 |
LongType() |
FloatType | float 注意:数字将在运行时转换为 4 字节单精度浮点数。 |
FloatType() |
DoubleType | float | DoubleType() |
DecimalType | decimal.Decimal | DecimalType() |
StringType | str | StringType() |
CharType(length) | str | CharType(length) |
VarcharType(length) | str | VarcharType(length) |
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 或 tuple | StructType(fields) 注意:fields 是 StructField 的序列。此外,不允许两个字段具有相同的名称。 |
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 |
CharType(length) | String | CharType(length) |
VarcharType(length) | String | VarcharType(length) |
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 是 StructField 的序列。此外,不允许两个字段具有相同的名称。 |
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 |
CharType(length) | String | DataTypes.createCharType(length) |
VarcharType(length) | String | DataTypes.createVarcharType(length) |
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 是 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 的序列。此外,不允许两个字段具有相同的名称。 |
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 |
CharType(length) | CHAR(length) |
VarcharType(length) | VARCHAR(length) |
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')),
(2, double('infinity')),
(3, double('inf')),
(4, double('-inf')),
(5, double('NaN')),
(6, double('NaN')),
(7, double('-infinity'))
;
SELECT COUNT(*), c2
FROM test
GROUP BY c2
ORDER BY c2;
+---------+---------+
| count(1)| c2|
+---------+---------+
| 2|-Infinity|
| 3| Infinity|
| 2| NaN|
+---------+---------+