数据类型
支持的数据类型
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 或 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。此外,不允许两个字段具有相同的名称。 |
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。此外,两个具有相同名称的字段是不允许的。 |
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 是一个List或StructFields的数组。同时,不允许有两个同名的字段。 |
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 or list |
list(type=”array”, elementType=
elementType
, containsNull=[
containsNull
])
注意: containsNull 的默认值为 TRUE。 |
MapType | environment |
list(type=”map”, keyType=
keyType
, valueType=
valueType
, valueContainsNull=[
valueContainsNull
])
注意: valueContainsNull 的默认值为 TRUE。 |
StructType | 命名列表 |
list(type=”struct”, fields=
fields
)
注意: fields 是 StructFields 的 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
|
StructType |
STRUCT
注意: ‘:’ 是可选的。 |
MapType |
MAP
|
浮点数特殊值
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 语义
在处理不是真正数字(NaN)时,对
float
或
double
类型有特殊处理,这些类型不完全符合标准浮点语义。具体来说:
- NaN = NaN 返回 true。
- 在聚合中,所有 NaN 值被分组在一起。
- NaN 在连接键中被视为正常值。
- 在升序时,NaN 值排在最后,比任何其他数字值都大。
示例
SELECT double('infinity') AS col;
+--------+
| col|
+--------+
|无限大|
+--------+
SELECT float() AS col;
+---------+
| col|
+---------+
|-无限大|
+---------+
SELECT float() AS col;
+---+
|col|
+---+
|非数字|
+---+
SELECT double() * 0 AS col;
+---+
|col|
+---+
|非数字|
+---+
SELECT double() * (-1234567) AS col;
+--------+
| col|
+--------+
|无限大|
+--------+
SELECT double() < double() AS col;
+----+
| col|
+----+
|true|
+----+
SELECT double() = double() AS col;
+----+
| col|
+----+
|true|
+----+
SELECT double() = double() AS col;
+----+
| col|
+----+
|true|
+----+
CREATE TABLE test (c1 int, c2 double);
INSERT INTO test VALUES (1, double());
INSERT INTO test VALUES (2, double());
INSERT INTO test VALUES (3, double());
INSERT INTO test VALUES (4, double());
INSERT INTO test VALUES (5, double());
INSERT INTO test VALUES (6, double());
INSERT INTO test VALUES (7, double());
SELECT COUNT(*), c2 FROM test GROUP BY c2;
+---------+---------+
| count(1)| c2|
+---------+---------+
| 2| 非数字|
| 2|-无限大|
| 3| 无限大|
+---------+---------+