数据类型
支持的数据类型
RainLake SQL 和 DataFrames 支持下面的数据类型:
数值类型
Numeric types
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
变体。如果输入字符串超过长度限制,则数据写入将失败。注意:此类型只能在表的schema中使用,不能在函数/运算符中使用。CharType(length)
: 一个长度固定的VarcharType(length)
变体。读取CharType(n)
类型的列始终返回长度为n
的字符串值。字符类型列的比较总会将短列填充到较长的长度。
二进制类型
BinaryType
: 表示字节序列值。
布尔类型
BooleanType
: 表示布尔值。
日期时间类型
DateType
: 表示没有时区的包含年、月、日的日期值。TimestampType
: 具有本地时区的时间戳 (TIMESTAMP_LTZ)。 它表示包含年、月、日、小时、分钟、秒和会话本地时区字段的值。时间戳值表示了一个绝对的时间点。TimestampNTZType
: 无时区时间戳 (TIMESTAMP_NTZ)。它表示包含年、月、日、小时、分钟和秒字段的值。执行所有操作时均不考虑时区。- 注意:RainLake 中的 TIMESTAMP 是一个用户指定的别名,与 TIMESTAMP_LTZ 和 TIMESTAMP_NTZ 变体相关联。用户可以通过配置
spark.sql.timestampType
将默认时间戳类型设置为TIMESTAMP_LTZ
(默认值) 或TIMESTAMP_NTZ
。
- 注意:RainLake 中的 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)。支持的日间时间间隔类型有:Day-Time Interval Type SQL type An instance of the type 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
用于指示StructType
值中的字段是否可以具有null
值。
RainLake SQL 的所有数据类型都位于包 pyspark.sql.types
中.
可以使用以下代码进行访问
{% highlight python %}
from pyspark.sql.types import *
{% endhighlight %}
Data type | Value type in Python | API to access or create a data type |
---|---|---|
ByteType | int 或 long 注意: 数字会在运行时转换为 1 字节的有符号整数。请确保数字在 -128 到 127 的范围内。 | ByteType() |
ShortType | int or long 注意: 数字会在运行时转换为 2 字节的有符号整数。请确保数字在 -32768 到 32767 的范围内。 | ShortType() |
IntegerType | int or 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, or array | ArrayType(elementType, [containsNull]) 注意: containsNull 的默认值为 True. |
MapType | dict | MapType(keyType, valueType, [valueContainsNull]) 注意: valueContainsNull 的默认值为 True. |
StructType | list or tuple | StructType(fields) 注意: fields 是一个 StructFields 的 Seq。 此外,不允许使用两个同名的字段。 |
StructField | The value type in Python of the data type of this field (For example, Int for a StructField with the data type IntegerType) | StructField(name, dataType, [nullable]) 注意: nullable 的默认值为 True。 |
RainLake SQL 的所有数据类型都位于包 org.apache.spark.sql.types
中.
可以使用以下代码进行访问
import org.apache.spark.sql.types._
在存储库的 examples/src/main/scala/org/apache/spark/examples/sql/SparkSQLExample.scala
中查找完整的示例代码。
Data type | Value type in Scala | API to access or create a data type |
---|---|---|
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 or java.sql.Timestamp | TimestampType |
TimestampNTZType | java.time.LocalDateTime | TimestampNTZType |
DateType | java.time.LocalDate or 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 | The value type in Scala of the data type of this field(For example, Int for a StructField with the data type IntegerType) | StructField(name, dataType, [nullable]) 注意: nullable 的默认值为 true。 |
RainLake SQL 的所有数据类型都位于包 org.apache.spark.sql.types
中.
可以使用 org.apache.spark.sql.types.DataTypes
中提供的工程模式进行访问。
Data type | Value type in Java | API to access or create a data type |
---|---|---|
ByteType | byte or Byte | DataTypes.ByteType |
ShortType | short or Short | DataTypes.ShortType |
IntegerType | int or Integer | DataTypes.IntegerType |
LongType | long or Long | DataTypes.LongType |
FloatType | float or Float | DataTypes.FloatType |
DoubleType | double or Double | DataTypes.DoubleType |
DecimalType | java.math.BigDecimal | DataTypes.createDecimalType() DataTypes.createDecimalType(precision, scale). |
StringType | String | DataTypes.StringType |
BinaryType | byte[] | DataTypes.BinaryType |
BooleanType | boolean or Boolean | DataTypes.BooleanType |
TimestampType | java.time.Instant or java.sql.Timestamp | DataTypes.TimestampType |
TimestampNTZType | java.time.LocalDateTime | DataTypes.TimestampNTZType |
DateType | java.time.LocalDate or 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 是一个 StructFields 的 List 或数组。此外,不允许使用两个同名的字段。 |
StructField | The value type in Java of the data type of this field (For example, int for a StructField with the data type IntegerType) | DataTypes.createStructField(name, dataType, nullable) |
下面的表显示了 RainLake SQL 解析器中每个数据类型的类型名称及其别名。
Data type | SQL name |
---|---|
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<element_type> |
StructType | STRUCT<field1_name: field1_type, field2_name: field2_type, ...> 注意: ':' 是可选的。 |
MapType | MAP<key_type, value_type> |
浮点特殊值
RainLake SQL 支持几种不区分大小写的浮点特殊值:
- Inf/+Inf/Infinity/+Infinity: 正无穷大
FloatType
: 相当于 Scala 中的Float.PositiveInfinity
。DoubleType
: 相当于 Scala 中的Double.PositiveInfinity
。
- -Inf/-Infinity: 负无穷大
FloatType
: 相当于 Scala 中的Float.NegativeInfinity
。DoubleType
: 相当于 Scala 中的Double.NegativeInfinity
。
- NaN: 非数字
FloatType
: 相当于 Scala 中的Float.NaN
。DoubleType
: 相当于 Scala 中的Double.NaN
。
正/负无穷大语义
正/负无穷大在 float
或 double
类型中具有特殊的处理,它们具有以下语义:
- 正无穷大乘以任何正值返回正无穷大。
- 负无穷大乘以任何正值返回负无穷大。
- 正无穷大乘以任何负值返回负无穷大。
- 负无穷大乘以任何负值返回正无穷大。
- 正/负无穷大乘以 0 返回 NaN。
- 正/负无穷大等于自身。
- 在聚合中,所有正无穷大值被分组在一起。同样,所有负无穷大值被分组在一起。
- 正/负无穷大在 join 键中被视为正常值。
- 正无穷大在升序中排序低于 NaN,高于任何其他值。
- 负无穷大在升序中排序低于任何其他值。
NaN 语义
在处理浮点类型类型(float
或 double
)时,RainLake SQL 对 NaN 具有特殊处理。具体来说:
- NaN = NaN 返回 true.
- 在聚合中,所有 NaN 值被分组在一起。
- NaN 在 join 键中被视为正常值。
- 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|
+---------+---------+