数据类型

Presto 有一组内置的数据类型,如下所述。插件可以提供其他类型。

注意

连接器不需要支持所有类型。有关支持的类型的详细信息,请参阅连接器文档。

布尔值

BOOLEAN

此类型捕获布尔值 truefalse

整数

注意

在将字符串转换为 TINYINTSMALLINTINTEGERBIGINT 时,强制转换函数允许前导和尾随空格。

TINYINT

8 位有符号二进制补码整数,最小值为 -2^7,最大值为 2^7 - 1

SMALLINT

16 位有符号二进制补码整数,最小值为 -2^15,最大值为 2^15 - 1

INTEGER

32 位有符号二进制补码整数,最小值为 -2^31,最大值为 2^31 - 1。名称 INT 也可用于此类型。

BIGINT

64 位有符号二进制补码整数,最小值为 -2^63,最大值为 2^63 - 1

浮点数

REAL

实数是 32 位不精确的,可变精度的,实现 IEEE 标准 754 用于二进制浮点运算。

Presto 在处理 NaN 时偏离了 IEEE 标准。在 Presto 中,NaN 被认为大于所有其他值,用于所有比较和排序操作。此外,NaN=NaN 对于所有相等性和不同性目的将为真。

DOUBLE

双精度是 64 位不精确的,可变精度的,实现 IEEE 标准 754 用于二进制浮点运算。

Presto 在处理 NaN 时偏离了 IEEE 标准。在 Presto 中,NaN 被认为大于所有其他值,用于所有比较和排序操作。此外,NaN=NaN 对于所有相等性和不同性目的将为真。

定点

DECIMAL

定点小数。支持高达 38 位的精度,但性能在高达 18 位时最佳。

小数类型采用两个文字参数

  • precision - 总位数

  • scale - 小数部分的位数。scale 是可选的,默认值为 0。

示例类型定义:DECIMAL(10,3)DECIMAL(20)

示例文字:DECIMAL '10.3'DECIMAL '1234567890'1.1

注意

出于兼容性原因,没有显式类型说明符的小数文字(例如 1.2)在版本 0.198 之前默认被视为 DOUBLE 类型的值。在 0.198 之后,它们被解析为 DECIMAL。

  • 系统范围属性:parse-decimal-literals-as-double

  • 会话范围属性:parse_decimal_literals_as_double

字符串

VARCHAR

可变长度字符数据,带有可选的最大长度。

示例类型定义:varcharvarchar(20)

SQL 支持简单和 Unicode 字符串文字
  • 文字字符串:'Hello winter !'

  • 使用默认转义字符的 Unicode 字符串:U&'Hello winter \2603 !'

  • 使用自定义转义字符的 Unicode 字符串:U&'Hello winter #2603 !' UESCAPE '#'

Unicode 字符串以 U& 为前缀,需要在使用任何 Unicode 字符时在其之前使用 4 位数字的转义字符。在这些示例中,\2603#2603 表示雪人字符。具有 6 位数字的长 Unicode 代码需要在代码之前使用加号符号 +。例如,对于咧嘴笑的 emoji,请使用 \+01F600

字符串文字中的单引号可以使用另一个单引号来转义:'It''s a beautiful day!'

CHAR

固定长度字符数据。没有指定长度的 CHAR 类型具有默认长度 1。 CHAR(x) 值始终具有 x 个字符。例如,将 dog 转换为 CHAR(7) 会添加 4 个隐式尾随空格。前导和尾随空格包含在 CHAR 值的比较中。因此,具有不同长度的两个字符值(CHAR(x)CHAR(y),其中 x != y)永远不会相等,但此类值的比较会隐式地将类型转换为相同的长度并用空格填充,以便以下查询返回 true

SELECT cast('example' AS char(20)) = cast('example    ' AS char(25));

VARCHAR 一样,CHAR 文字中的单引号可以使用另一个单引号来转义

SELECT CHAR 'All right, Mr. DeMille, I''m ready for my close-up.'

VARBINARY

可变长度二进制数据。

注意

尚不支持具有长度的二进制字符串:varbinary(n)

JSON

JSON 值类型,可以是 JSON 对象、JSON 数组、JSON 数字、JSON 字符串、truefalsenull

日期和时间

DATE

日历日期(年、月、日)。

示例:DATE '2001-08-22'

TIME

一天中的时间(小时、分钟、秒、毫秒),不包含时区。此类型的值将在会话时区内解析和呈现。

示例:TIME '01:02:03.456'

TIME WITH TIME ZONE

一天中的时间(小时、分钟、秒、毫秒),包含时区。此类型的值将使用值中的时区进行呈现。

示例:TIME '01:02:03.456 America/Los_Angeles'

TIMESTAMP

包含日期和时间的瞬间,不包含时区。此类型的值将在会话时区内解析和呈现。

示例:TIMESTAMP '2001-08-22 03:04:05.321'

TIMESTAMP WITH TIME ZONE

包含日期和时间的瞬间,包含时区。此类型的值将使用值中的时区进行呈现。

示例:TIMESTAMP '2001-08-22 03:04:05.321 America/Los_Angeles'

INTERVAL YEAR TO MONTH

年和月的跨度。

示例:INTERVAL '3' MONTH

INTERVAL DAY TO SECOND

天、小时、分钟、秒和毫秒的跨度。

示例:INTERVAL '2' DAY

结构化

ARRAY

给定组件类型数组。

示例:ARRAY[1, 2, 3]

MAP

给定组件类型之间的映射。

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

ROW

由命名字段组成的结构。字段可以是任何 SQL 类型,并且可以使用字段引用运算符 . 访问。

示例:CAST(ROW(1, 2.0) AS ROW(x BIGINT, y DOUBLE))

网络地址

IPADDRESS

可以表示 IPv4 或 IPv6 地址的 IP 地址。

在内部,该类型是纯 IPv6 地址。对 IPv4 的支持是使用 _IPv4 映射的 IPv6 地址_ 范围 (RFC 4291#section-2.5.5.2) 进行处理。在创建 IPADDRESS 时,IPv4 地址将被映射到该范围内。

在格式化 IPADDRESS 时,映射范围内任何地址都将被格式化为 IPv4 地址。其他地址将使用 RFC 5952 中定义的规范格式格式化为 IPv6。

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

IPPREFIX

可以表示 IPv4 或 IPv6 地址的 IP 路由前缀。

在内部,地址是纯 IPv6 地址。对 IPv4 的支持是使用 _IPv4 映射的 IPv6 地址_ 范围 (RFC 4291#section-2.5.5.2) 进行处理。在创建 IPPREFIX 时,IPv4 地址将被映射到该范围内。此外,地址将被缩减到网络的第一个地址。

IPPREFIX 值将以 CIDR 表示法格式化,写成 IP 地址、斜杠(‘/’)字符和前缀的位长度。IPv4 映射的 IPv6 地址范围内的任何地址都将被格式化为 IPv4 地址。其他地址将使用 RFC 5952 中定义的规范格式格式化为 IPv6。

示例:IPPREFIX '10.0.1.0/24', IPPREFIX '2001:db8::/48'

UUID

UUID

此类型表示 UUID(通用唯一标识符),也称为 GUID(全局唯一标识符),使用 RFC 4122 中定义的格式。

示例:UUID '12151fd2-7586-11e9-8f9e-2a86e4085a59'

HyperLogLog

使用 HyperLogLog 数据草图,可以比精确计数更便宜地计算近似不同的计数。参见 HyperLogLog 函数

HyperLogLog

HyperLogLog 草图允许有效地计算 approx_distinct()。它从稀疏表示开始,当它变得更有效时切换到密集表示。

P4HyperLogLog

P4HyperLogLog 草图类似于 HyperLogLog,但它从(并且保持)密集表示开始。

KHyperLogLog

KHyperLogLog

KHyperLogLog 是一种数据草图,可用于紧凑地表示两列的关联。参见 KHyperLogLog 函数

SetDigest

SetDigest

SetDigest(setdigest)是一种数据草图结构,用于计算两个集合之间的 Jaccard 相似系数

SetDigest 包含以下组件

HyperLogLog 结构用于近似原始集合中不同的元素。

MinHash 结构用于存储原始集合的低内存占用签名。通过比较两个集合的签名来估计任何两个集合的相似度。

SetDigest 是可加的,这意味着它们可以合并在一起。

SFM 草图

SfmSketch

Sketch-Flip-Merge(SFM)数据草图是一种类似于 HyperLogLog 的噪声随机不同计数草图。参见 noisy_approx_set_sfm()

分位数摘要

QDigest

分位数摘要 (qdigest) 是一种摘要结构,它捕获给定输入集的数据的近似分布,并且可以查询以从分布中检索近似分位数。qdigest 的准确度级别是可调的,允许以空间为代价获得更精确的结果。

qdigest 可用于对询问特定分位数上属于哪个值的查询给出近似答案。qdigest 的一个有用属性是它们是可加的,这意味着它们可以合并在一起而不会损失精度。

approx_percentile 的部分结果可以重用时,qdigest 可能会有所帮助。例如,人们可能对一周内每天读取的第 99 个百分位数的值感兴趣。不是用 approx_percentile 计算过去一周的数据,而是可以每天存储 qdigest,然后快速合并以检索第 99 个百分位数的值。

参见 分位数摘要函数

T-Digest

TDigest

T-digest 类似于 qdigest,但它使用 不同的算法 来表示一组数字的近似分布。T-digest 比分位数摘要性能更好,但只支持 DOUBLE 类型。参见 T-Digest 函数

KLL 草图

KLL Sketch

KLL 草图类似于 qdigest,但与 T-Digest 一样,它使用 不同的算法 来表示一组值的近似分布。Presto 中的 KLL 草图支持 int、bigint、double、varchar 和 boolean 类型。有关更多信息,请参见 草图函数。在序列化形式中,Presto 存储的 kllsketch 类型可以直接被任何其他使用 Apache DataSketches 库来读取 KLL 草图的应用程序读取。

地理空间

Geospatial

Presto 中的地理空间类型旨在高效地处理和分析空间数据,符合 SQL/MM 规范和开放地理空间联盟标准。这些类型包括 POINTLINESTRINGPOLYGONMULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION,它们可以用 Well-Known Text (WKT) 和 Well-Known Binary (WKB) 格式表示。这些类型支持空间测量和关系检查等操作,对于地理信息系统 (GIS) 和其他需要空间数据操作的应用程序至关重要。地理空间类型确保数据完整性,并为复杂的空间查询和分析提供强大的工具。

请参见 地理空间函数