Presto 默认支持多种常见的数据类型,包括布尔类型、整型、浮点型、字符串、日期等。同时,用户可以通过插件等方式增加自定义的数据类型。并且,自定义的 Presto 连接器不需要支持所有数据类型。

数值类型

Presto 内置支持如下几种数值类型:

  • BOOLEAN

    表示一个二值选项,值为TRUEFALSE

  • TINYINT

    表示一个 8 位有符号整型,二进制补码形式存储

  • SMALLINT

    表示一个 16 位有符号整型,二进制补码形式存储

  • INTEGER

    表示一个 32 位有符号整型,二进制补码形式存储

  • BIGINT

    表示一个 64 位有符号整型,二进制补码形式存储

  • REAL

    一个 32 位多精度的[IEEE-754]二进制浮点数值实现

  • DOUBLE

    一个 64 位多精度的[IEEE-754]二进制浮点数值实现

  • DECIMAL

    一个固定精度的数值类型,最大可支持 38 位有效数字,有效数字在 17 位以下性能最好。定义DECIMAL类型字段时需要确定两个字面参数:

    1. 精度(precision)数值总的位数,不包括符号位
    2. 范围(scale)小数位数,可选参数,默认为 0

    示例:DECIMAL '-10.7'该值可用DECIMAL(3,1)类型表示。

下表说明整型数值类型的位宽和取值范围:

数值类型 位宽 最小值 最大值
TINYINT 8 bit -2^7 2^7 - 1
SMALLINT 16 bit 2^15 2^15 - 1
INTEGER 32 bit -2^31 -2^31 - 1
BIGINT 64 bit -2^63 -2^63 - 1

字符类型

Presto 内置支持如下几种字符类型:

  • VARCHAR

    表示一个可变长度的字符串类型,可以设置最大长度。

    示例:VARCHAR, VARCHAR(10)

  • CHAR

    表示一个固定长度的字符串类型,使用时可以指定字符串的长度,不指定则默认为1

    示例:CHAR, CHAR(10)

    注意 指定了长度的字符串总是包含与该长度相同的字符,如果字符串字面长度小于指定长度,则不足部分会用不可见字符填充,填充部分也会参与字符比较,因此,两个字面量一样的字段,如果它们的长度定义不一样,就永远不可能相等。
  • VARBINARY 表示一块可变长度的二进制数据。

日期和时间

Presto 内置支持如下几种时间和日期类型:

  • DATE

    表示一个日期类型的字段,日期包括年、月、日,但是不包括时间。

    示例: DATE '1988-01-30'

  • TIME

    表示一个时间类型,包括时、分、秒、毫秒。时间类型可以加时区进行修饰。

    示例:

    • TIME '18:01:02.345', 无时区定义,使用系统时区进行解析。
    • TIME '18:01:02.345 Asia/Shanghai', 有时区定义,使用定义的时区进行解析。
  • TIMESTAMP

    表示一个时间戳类型的字段,时间戳包含了日期和时间两个部分的信息,取值范围为'1970-01-01 00:00:01' UTC'2038-01-19 03:14:07' UTC,支持使用时区进行修饰。

    示例:TIMESTAMP '1988-01-30 01:02:03.321', TIMESTAMP '1988-01-30 01:02:03.321 Asia/Shanghai'

  • INTERVAL

    主要用于时间计算表达式中,表示一个间隔,单位可以是如下几个:

    • YEAR - 年
    • QUARTER - 季度
    • MONTH - 月
    • DAY - 天
    • HOUR - 小时
    • MINUTE - 分钟
    • SECOND - 秒
    • MILLISECOND - 毫秒

    示例: DATE '2012-08-08' + INTERVAL '2' DAY

复杂类型

Presto内置支持多种复杂的数据类型,以便支持更加复杂的业务场景,这些类型包括:

  • JSON

    表示字段为一个 JSON 字符串,包括 JSON 对象、JSON 数组、JSON 单值(数值或字符串),还包括布尔类型的truefalse以及表示空的null

    示例:

    • JSON '[1, null, 1988]'
    • JSON '{"k1":1, "k2": "abc"}'
  • ARRAY

    表示一个数组,数组中各个元素的类型必须一致。

    示例:ARRAY[1, 2, 3]

  • MAP

    表示一个映射关系,由键数组和值数组组成。

    示例:MAP(ARRAY['foo', 'bar'], ARRAY[1, 2])

  • ROW

    表示一行数据,行中每个列都有列名对应,可以使用.运算符+列名的方式来访问数据列。

    示例:CAST(ROW(1988, 1.0, 30) AS ROW(y BIGINT, m DOUBLE, d TINYINT ))

  • IPADDRESS

    表示一个 IPv4 或 IPv6 地址。内部实现上,将 IPv4 处理成 IPv6 地址使用(IPv4 到 IPv6 映射表)。

    示例:IPADDRESS '0.0.0.0', IPADDRESS '2001:db8::1'