数据类型

支持的数据类型

Spark SQL 和 DataFrame 支持以下数据类型

所有 Spark SQL 的数据类型都位于 pyspark.sql.types 包中。您可以通过以下方式访问它们

from pyspark.sql.types import *
数据类型 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 以不区分大小写的方式支持几种特殊的浮点数

正/负无穷大语义

对正无穷大和负无穷大有特殊处理。它们具有以下语义

NaN 语义

在处理与标准浮点语义不完全匹配的 floatdouble 类型时,对非数字 (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|
+---------+---------+