支持的数据类型
SparkSQL支持的数据类型如下:
- 数值类型
- ByteType:表示1字节带符号整数(“带符号”意味着它可以表示正数和负数。)。数字的范围是-128到127。
- ShortType:表示2字节带符号整数。数字的范围是-32768到32767。
- IntegerType:表示4字节带符号整数。数字的范围是-2147483648到2147483647。
- LongType:表示8字节有符号整数。数字的范围为-922372036854775808到9223372036854775807。
- FloatType:表示4字节单精度浮点数。
- DoubleType:表示8字节双精度浮点数。
- DecimalType:表示任意精度带符号十进制数。内部由java.math支持。BigDecimal。BigDecimal由一个任意精度的未缩放整数和一个32位整数小数组成。
- “带符号”意味着它可以表示正数和负数。
- 单精度
根据IEEE 754标准,单精度浮点数的32位被划分为三个部分:
符号位(1位):表示数值的正负号。
指数部分(8位):表示数值的指数部分,用来表示数值的大小。
尾数部分(23位):表示数值的小数部分,用来表示数值的精度。- 双精度
根据IEEE 754标准,双精度浮点数的64位被划分为三个部分:
符号位(1位):表示数值的正负号。
指数部分(11位):表示数值的指数部分,用来表示数值的大小。
尾数部分(52位):表示数值的小数部分,用来表示数值的精度。- BigDecimal
由于 BigDecimal 的无符号整数值可以非常大(理论上没有上限,受限于内存大小),并且比例也可> 以取任意值,因此 BigDecimal 可以表示任意精度的数值。
- 字符串类型
- StringType:表示字符串值。
- VarcharType(length):这是一种带有长度限制的 StringType 变体。如果输入字符串超过长度限制,则数据写入将失败。注意:这种类型只能在表结构中使用,不能在函数或操作符中使用。
- CharType(length):VarcharType(长度)的一种变体,长度固定。读取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。
- 间隔类型
- YearMonthIntervalType(startField, endField):表示由以下字段的连续子集组成的年月间隔:月份,年内的月份[0…11];年份,在[0…178956970]范围内的年份。
startField 是最左侧的字段,而 endField 是最右侧的字段。startField 和 endField 的有效值分别是 0(MONTH)和 1(YEAR)。
- DayTimeIntervalType(startField, endField):表示由以下字段的连续子集组成的一天时间间隔:
- SECOND,分钟内的秒数,可能还有几分之一秒[0…59.999999],
- MINUTE,小时内的分钟[0…59],HOUR,天内的小时[0…23],DAY,范围[0…106751991]内的天。
单个区间字段是非负的,但区间本身可以有一个符号,并且是负的。
startField是该类型的最左侧字段,endField是最右侧字段。startField和endField的有效值为0(天)、1(小时)、2(分钟)、3(秒)
- 复杂类型
- ArrayType(elementType, containsNull):表示由elementType类型的元素序列组成的值。contains null用于指示ArrayType值中的元素是否可以具有null值。
- MapType(keyType, valueType, valueContainsNull):表示由一组键值对组成的值。键的数据类型由keyType描述,而值的数据类型则由valueType描述。对于MapType值,键不允许具有null值。valueContainsNull用于指示MapType值的值是否可以为空值。
- StructType(fields):用StructFields(字段)序列描述的结构表示值。
- StructField(name, dataType, nullable):表示StructType中的字段。字段的名称由name表示。字段的数据类型由dataType表示。null用于指示这些字段的值是否可以为null。
类名和别名汇总
浮点特殊值
Spark SQL以不区分大小写的方式支持几个特殊的浮点值:
- Inf/+Inf/Infinity/+Infinity:正无穷大
- FloatType:equivalent to Scala Float.PositiveInfinity。
- DoubleType:equivalent to Scala Double.PositiveInfinity。
- -Inf/-Infinity:负无穷
- FloatType: equivalent to Scala Float.NegativeInfinity。
- DoubleType: equivalent to Scala Double.NegativeInfinity。
- NaN:非数值
- FloatType: equivalent to Scala Float.NaN。
- DoubleType: equivalent to Scala Double.NaN。
正/负无穷语义
对正无穷大和负无穷大有特殊的处理。它们具有以下语义:
- 正无穷大乘以任何正值返回正无穷大。
- 负无穷大乘以任何正值都会返回负无穷大。
- 正无穷大乘以任何负值都会返回负无穷大。
- 负无穷大乘以任何负值都会返回正无穷大。
- 正/负无穷乘以0返回NaN。
- 正/负无穷大等于自身。
- 在聚合中,所有正无穷大值都被分组在一起。同样,所有负无穷大值都被分组在一起。
- 正无穷大和负无穷大在连接键中被视为正常值。
- 正无穷排序低于NaN,高于任何其他值。
- 负无穷排序低于任何其他值。
NaN语义
在处理与标准浮点语义不完全匹配的浮点或双精度类型时,对非数字(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|
+---------+---------+
参考文献
https://spark.apache.org/docs/latest/sql-ref-datatypes.html