添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

tinyint – 一个 8 位有符号的整数,采用二进制补码格式,最小值为 -2 7 ,最大值为 2 7 -1。

smallint – 一个 16 位有符号的整数,采用二进制补码格式,最小值为 -2 15 ,最大值为 2 15 -1。

int integer – Athena 根据查询类型使用不同的整数表达式。

bigint – 一个 64 位有符号的整数,采用二进制补码格式,最小值为 -2 63 ,最大值为 2 63 -1。

double – 64 位有符号的双精度浮点数。范围为 4.94065645841246544e-324d 至 1.79769313486231570e+308d,正或负。 double 遵循 IEEE 浮点算法标准 (IEEE 754)。

float – 32 位有符号的单精度浮点数。范围为 1.40129846432481707e-45 至 3.40282346638528860e+38,正或负。 float 遵循 IEEE 浮点算法标准 (IEEE 754)。相当于 Presto 中的 real 。在 Athena 中,在 CREATE TABLE 等 DDL 语句中使用 float ,在 SELECT CAST 等 SQL 函数中使用 real 。AWS Glue 爬网程序以 float 返回值, Athena 将内部翻译 real float 类型(请参阅 2018 年 6 月 5 日 发布说明)。

decimal ( precision , scale ) precision 是总位数,而 scale (可选)是小数部分的位数,默认值为 0。例如,使用以下类型定义: decimal(11,5) decimal(15) 。最大 精度 值为 38,最大 标度 值为 38。

要将十进制值指定为文字(例如在查询 DDL 表达式中选择具有特定十进制值的行时),请指定 decimal 类型定义,并在查询中将十进制值列为文字(带单引号),如下例所示: decimal_value = decimal '0.12'

char – 固定长度字符数据,具有介于 1 和 255 之间的指定长度,例如 char(10) 。有关更多信息,请参阅 CHAR Hive 数据类型

注意

要使用 substr 函数从 char 数据类型返回指定长度的子字符串,您必须先将 char 值转换为 varchar ,如以下示例所示。

substr(cast(col1 as varchar), 1, 4)

varchar – 可变长度字符数据,具有介于 1 和 65535 之间的指定长度,例如 varchar(10) 。有关更多信息,请参阅 VARCHAR Hive 数据类型

string – 用单引号或双引号括起的字符串文本。有关更多信息,请参阅 STRING Hive 数据类型

注意

在 Athena 中,无法将非字符串数据类型强制转换为 string ;而是将这些数据类型强制转换为 varchar

binary – 用于 Parquet 中的数据。

date – ISO 格式的日期,例如 YYYY - MM - DD 。例如, date '2008-09-15' 。一个例外是 OpenCSVSerDe,它使用自 1970 年 1 月 1 日以来经过的天数。有关更多信息,请参阅 OpenCsVSerDe用于处理 CSV

timestamp – 使用 java.sql.Timestamp 兼容格式的瞬间日期和时间最多可达毫秒级的最大分辨率,例如 yyyy - MM - dd HH : mm : ss [.f ... ] 。例如, timestamp '2008-09-15 03:04:05.324' 。一个例外是 OpenCsVSerDe ,它使用 timestamp UNIX 数字格式的数据(例如, 1579059880000 )。

有关使用时间戳的更多信息,请参阅 处理时间戳数据 在本文档的后面部分。

array < data_type > – 给定组件类型的数组。

CREATE TABLE table array_table (c1 array<integer>) LOCATION '...'; INSERT INTO array_table values(ARRAY[1,2,3]);

map < primitive_type , data_type > – 给定组件类型之间的映射。

CREATE TABLE map_table(c1 map<string, integer>) LOCATION '...'; INSERT INTO map_table values(MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]));

struct < col_name : data_type [comment col_comment ] , ... > – 不同组件类型的元素集合。

CREATE TABLE struct_table(c1 struct<name:varchar(10), age:integer>) LOCATION '...'; INSERT INTO struct_table SELECT CAST(ROW('Bob', 38) AS ROW(name VARCHAR(10), age INTEGER));

处理时间戳数据

本节介绍在 Athena 中使用时间戳数据时的一些注意事项。

注意

在 Athena 引擎版本 2 和 Athena 引擎版本 3 之间,时间戳的处理发生了一些变化。有关 Athena 引擎版本 3 中可能发生的时间戳相关错误以及建议的解决方案的信息,请参见 时间戳更改 Athena 引擎版本 3 参考。

将时间戳数据写入 Amazon S3 对象的格式

将时间戳数据写入 Amazon S3 对象的格式取决于列数据类型和 SerDe图书馆 你用的。

如果您的表列类型为 DATE ,Athena 希望数据的相应列或属性是 ISO 格式的字符串 YYYY-MM-DD ,或者像 Parquet 或 ORC 这样的内置日期类型。

如果您的表列类型为 TIME ,Athena 希望数据的相应列或属性是 ISO 格式的字符串 HH:MM:DD ,或者像 Parquet 或 ORC 这样的内置时间类型。

如果您的表列类型为 TIMESTAMP ,Athena 希望数据的相应列或属性是格式为字符串 YYYY-MM-DD HH:MM:SS.SSS (注意日期和时间之间的间隔),或者像Parquet、ORC 或 Ion 这样的内置时间类型。

注意

OpenCsVSerDe时间戳是个例外,必须编码为毫秒分辨率的 UNIX 纪元。

确保时间分区数据与记录中的时间戳字段相匹配

数据的生成者必须确保分区值与分区内的数据一致。例如,如果你的数据有 timestamp 属性然后你使用 Kinesis Data Firehose 将数据加载到 Amazon S3 中,你必须使用 动态分区 因为 Kinesis Data Firehose 的默认分区是wall-clock-based。

使用字符串作为分区键的数据类型

出于性能原因,最好使用 STRING 作为分区键的数据类型。尽管 Athena 能识别格式中的分区值 YYYY-MM-DD 作为你使用时的日期 DATE 类型,这可能会导致性能不佳。因此,我们建议您使用 STRING 改为分区键的数据类型。

如何为也是时间分区的时间戳字段编写查询

如何为时间分区的时间戳字段编写查询取决于要查询的表类型。

Hive 桌子

由于 Athena 中最常用的 Hive 表,查询引擎对列和分区键之间的关系一无所知。因此,您必须始终在查询中为列和分区键添加谓词。

例如,假设你有一个 event_time 一栏和一列 event_date 分区键并想查询 23:00 到 03:00 之间的事件。在这种情况下,您必须在列和分区键的查询中包括谓词,如以下示例所示。

WHERE event_time BETWEEN start_time AND end_time AND event_date BETWEEN start_time_date AND end_time_date

在 Iceberg 表中,您可以使用计算分区值,这样可以简化查询。例如,假设您的 Iceberg 表是使用创建的 PARTITIONED BY 子句如下所示:

PARTITIONED BY (event_date month(event_time))