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))