Athena 引擎版本参考 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Athena 引擎版本参考

本节列出了自 Athena 以来对 查询引擎进行的更改。 是 Athena 的初始引擎版本,基于 Presto 0.172

基于 Presto 0.217 的 引入了以下更改。

改进和新功能

  • 联合查询 中支持 – 联合查询。有关更多信息,请参阅 使用 Amazon Athena Federated Query (Preview).

  • Geospatial functions (地理空间函数) – 添加了 25 个以上的地理空间函数。有关更多信息,请参阅 中的新地理空间函数 .

  • 嵌套架构 增加了对读取嵌套架构的支持,从而降低成本。–

  • 架构演进支持 已为 Parquet 格式的数据添加 – 架构演进支持。

    • 增加了对从分区架构不同于表架构的分区读取数组、映射或行类型列的支持。在创建分区后更新表架构时,可能会发生这种情况。更改的列类型必须兼容。对于行类型,可以添加或删除尾随字段,但对应的字段(按序号)必须具有相同的名称。

    • ORC 文件现在可以具有缺少字段的结构列。这允许在不重写 ORC 文件的情况下更改表架构。

    • ORC 结构列现在按名称而不是按序数进行映射。这可正确处理 ORC 文件中的缺失或额外结构字段。

分组、联接和子查询改进

  • 复杂分组 增加了对复杂分组操作的支持。–

  • 关联子查询 增加了对 – 谓词中的关联子查询和需要强制关联的关联子查询的支持。IN

  • 跨 JOIN – 增加了对 CROSS JOIN 派生表的 LATERAL 支持。

  • GROUPING SETS – 增加了对使用 ORDER BY 的查询聚合中的 GROUPING SETS 子句的支持。

  • Lambda 表达式 增加了对 – 表达式中取消引用行字段的支持。Lambda

  • 半联接中的 Null 值 增加了对半联接左侧的 null 值(即,带子查询的 – 谓词)的支持。IN

  • 空间联接 – 增加了对广播空间联接和空间左联接的支持。

  • 溢出到磁盘 对于内存密集型 – 和 INNER JOIN 操作,LEFT JOIN 将中间操作结果卸载到磁盘。Athena这样可执行需要大量内存的查询。

  • INT for INTEGER 增加了对 – 作为 INT 数据类型别名的支持。INTEGER

  • INTERVAL 类型 添加了对转换为 – 类型的支持。INTERVAL

  • IPADDRESS – 添加了一个新的 IPADDRESS 类型来表示 IP 地址。添加了对在 VARBINARY 类型和 IPADDRESS 类型之间进行转换的支持。

  • IS DISTINCT FROM – 添加了对 IS DISTINCT FROMJSON 类型的 IPADDRESS 支持。

  • Null 相等检查 现在支持针对 –、ARRAYMAP 数据结构中的 null 值的相等检查。ROW例如,表达式 ARRAY ['1', '3', null] = ARRAY ['1', '2', null] 返回 false。 以前,null 元素会返回错误消息 comparison not supported.

  • 行类型强制转换 现在允许行类型之间的强制转换,而不管字段名称如何。–以前,只有在源类型中的字段名称与目标类型匹配,或者目标类型具有匿名字段名称时,行类型才会强制转换为另一个。

  • 时间减去 为所有 – 和 TIME 类型实现了减。TIMESTAMP

  • Unicode 添加了对字符串文本中的转义 Unicode 序列的支持。–

  • VARBINARY 联接 – 添加了对 VARBINARY 值联接的支持。

函数的其他输入类型

以下函数现在接受其他输入类型。有关每个函数的更多信息,请访问指向 Presto 文档的相应链接。

增加了 函数

以下列表包含 Athena 引擎版本 2 中新增的功能。该列表不包括地理空间函数。有关地理空间函数的列表,请参阅中的新地理空间函数

有关每个函数的更多信息,请访问指向 Presto 文档的相应链接。

聚合函数

reduce_agg()

数组函数和运算符

array_sort() – 添加了将该函数作为比较器的 Lambda 函数的变体。

ngrams()

二进制函数和运算符

来自_big_endian_32()

从_ieee754_32()

来自_ieee754_64()

hmac_md5()

hmac_sha1()

hmac_sha256()

hmac_sha512()

spooky_hash_v2_32()

spooky_hash_v2_64()

to_big_endian_32()

to_ieee754_32()

to_ieee754_64()

日期与时间函数和运算符

毫秒()

parse_duration ()

to_milliseconds()

映射函数和运算符

multimap_from_entries()

数学函数和运算符

反正则 cdf()

wilson_interval_lower()

wilson_interval_upper()

分位数摘要函数

分位数摘要函数qdigest 分位数摘要类型已添加。

字符串函数和运算符

hamming_distance()

split_to_multimap()

性能改进

以下功能的性能在 Athena 引擎版本 2 中有所提高。

查询性能
  • Bucketed tables (分桶表) – 提高了在写入的数据已得到适当分区时(例如,输出来自分桶联接时)写入到分桶表的性能。

  • DISTINCT – 改进了使用 DISTINCT 的某些查询的性能。

  • Filter and 投影操作 – 尽可能让筛选和投影操作始终由列处理。该引擎会在生效时自动利用字典编码。

  • 收集交换 通过收集交换提高了查询的性能。–

  • 全局聚合 – 改进了执行筛选后的全局聚合的某些查询的性能。

  • GROUPING SETS、CUBE、ROLLUP – 提高了涉及 GROUPING SETSCUBEROLLUP 的查询的性能。

  • 高选择性筛选条件 – 提高了具有高选择性筛选条件的查询性能。

  • JOIN 和 AGGREGATE 操作 – 和 JOIN 操作的性能得到增强。AGGREGATE

  • LIKE – 提高了在 LIKE 表的列上使用 information_schema 谓词的查询的性能。

  • ORDER BY 和 LIMIT 改进了涉及 – 和 ORDER BY 的查询的计划、性能和内存使用率,以避免不必要的数据交换。LIMIT

  • ORDER BY – 现在默认分发 ORDER BY 操作,从而允许使用更大的 ORDER BY 子句。

  • ROW 类型转换 – 提高了在 ROW 类型之间进行转换时的性能。

  • 结构类型 提高处理结构类型且包含扫描、联接、聚合或表写入的查询的性能。–

  • UNION – 提高了 UNION 查询的性能。

查询计划性能
  • 规划性能 改进了联接多个表和大量列的查询的规划性能。–

  • 谓词评估 – 改进了规划中的谓词下推期间的谓词评估性能。

  • 支持转换的谓词下推 – 支持 的谓词下推 <column> IN <values list> 值列表中的谓词,其中的值需要强制转换以匹配列的类型。

  • 谓词推理和下推 对于使用 – 的查询,扩展了谓词推理和下推 <symbol> IN <subquery> 谓词。

联接性能
  • 与映射列联接 提高了包含映射列的联接和聚合性能。–

  • 只是具有非相等条件的联接 – 通过使用嵌套循环联接而不是哈希联接,改进了仅具有不相等条件的联接的性能。

  • 外部联接 – 现在为涉及外部联接的查询自动选择联接分配类型。

  • Range over a function joins (函数范围联接) – 改进了条件是函数范围(例如,a JOIN b ON b.x < f(a.x) AND b.x > g(a.x))的联接的性能。

子查询性能
  • 关联 EXISTS 子查询 – 提高了关联 EXISTS 子查询的性能。

  • 具有相等性的关联子查询 改进了对包含相等谓词的关联子查询的支持。–

  • 具有不相等的关联子查询 改进了包含不相等性的相关子查询的性能。–

  • count(*) aggregations over subqueries (基于子查询的 计数(*) 聚合) – 通过已知常量基数的子查询提高了 count(*) 聚合性能。

  • 外部查询筛选器传播 提高了在外部查询中的筛选器可以传播到子查询时关联子查询的性能。–

函数性能
  • Aggregate window functions (聚合窗口函数) – 改进了聚合窗口函数的性能。

  • element_at() – 提高了 element_at() 的性能,使映射的时间恒定,而不是与映射大小成正比。

  • grouping() – 提高了涉及 grouping() 的查询的性能。

  • JSON 转换 – 提高了从 JSON 转换为 ARRAYMAP 类型的性能。

  • 映射返回函数 – 改进了返回映射的函数的性能。

  • Map-to-map casting – 改进了 map-to-map cast 的性能。

  • min() 和 max() – 和 min() 函数已经过优化,可避免不必要的对象创建,从而减少垃圾回收开销。max()

  • row_number() – 改进了使用 row_number() 的查询的性能和内存使用率,然后对生成的行号进行了筛选器。

  • 窗口函数 提高了包含具有相同 – 和 PARTITION BY 子句的窗口函数的查询的性能。ORDER BY

  • Window functions (窗口函数) – 改进了具有类似规范的某些窗口函数(例如 LAG)的性能。

地理空间性能
  • 几何体序列化 – 改进了几何体值的序列化性能。

  • 地理空间函数 – 改进了 ST_Intersects()ST_Contains()ST_Touches()ST_Within()ST_Overlaps()ST_Disjoint()transform_values()ST_XMin()ST_XMax()ST_YMin()ST_YMax()ST_Crosses()array_intersect() 的性能。

  • ST_Distance() – 提高了涉及 ST_Distance() 函数的联接查询的性能。

  • ST_Intersection() – 针对与坐标轴对齐的矩形(例如,由 ST_Intersection()ST_Envelope() 函数生成的多边形)优化了 bing_tile_polygon() 函数。

映射函数

  • 在所有情况下,将映射子脚本的性能从 O(n) 提高到 O(1)。以前,只有特定函数和读者生成的映射才能使用此改进。

  • 添加了 map_from_entries()map_entries() 函数。

强制转换

  • 添加了从 JSONREALTINYINT 强制转换为 SMALLINT 的功能。

  • 您现在可以将 JSON 强制转换为 ROW,即使 JSON 不包含 ROW 中的每个字段也是如此。

  • 改进了 CAST(json_parse(...) AS ...) 的性能。

  • 改进了从 JSON 转换为 ARRAYMAP 类型的性能。

新的 JSON 函数

重大更改

重大更改包括错误修复、对地理空间函数的更改、替换的函数以及引入的限制。ANSI SQL 合规性的改进可能会破坏依赖于非标准行为的查询。

错误修复

以下更改了导致查询成功运行但结果不准确的行为问题。

  • json_parse() 不再忽略尾随字符 以前,– 等输入将成功解析为 [1,2]abc[1,2] 现在,使用尾随字符会生成错误消息 Cannot convert '[1, 2]abc' to JSON.

  • round() decimal precision corrected 现在,当 – 为 DECIMAL 或 round(x, d) 为小数位数 0 且 x 为负整数时,x 可正确舍入 xd以前,在这些情况下,不会进行舍入。

  • round(x, d) 和 truncate(x, d) 函数签名中的参数 – 和 d 现在为 round(x, d) 类型。truncate(x, d)INTEGER 以前,d 的类型可以是 BIGINT

  • map() with replicate keys (带重复键的 Map()map() 现在会对重复键引发错误,而不是无提示地生成损坏的映射。当前使用重复键构造映射值的查询现在失败,出现错误。

  • map_from_entries() 引发包含 null 条目的错误 map_from_entries() 现在在输入数组包含 null 条目时引发错误。通过将 NULL 作为值传递来构建映射的查询现在将失败。

  • 无法再创建具有不支持的分区类型的表。–

  • 提高了统计函数的数值稳定性 – 提高了统计函数 corr()covar_samp()regr_intercept()regr_slope() 的数值稳定性。

  • 时区信息 时区信息现在是使用 Java 1.8 开发工具包的 –java.time 程序包计算的。

  • INTERVAL_DAY_TO_SECOND 和 INTERVAL_YEAR_TO_MONTH 数据类型的 SUM 您不再能够直接使用 –。SUM(NULL)要使用 SUM(NULL),请将 NULL 强制转换为 BIGINTDECIMALREALDOUBLEINTERVAL_DAY_TO_SECONDINTERVAL_YEAR_TO_MONTH 等数据类型。

对地理空间函数的更改

对地理空间函数进行的更改包括以下内容。

  • 函数名称更改 – 某些函数名称已更改。有关更多信息,请参阅 中的地理空间函数名称更改 .

  • VARBINARY 输入 – 不再直接支持将 VARBINARY 类型用于地理空间函数的输入。例如,要直接计算几何体的区域,几何体现在必须采用 VARCHARGEOMETRY 格式输入。解决方法是使用转换函数,如以下示例所示。

    • 要使用 ST_area() 以已知二进制 (WKB) 格式计算 VARBINARY 输入的区域,请先将输入传递到 ST_GeomFromBinary(),例如:

      ST_area(ST_GeomFromBinary(<wkb_varbinary_value>))
    • 要使用 ST_area() 以传统二进制格式计算 VARBINARY 输入的区域,请先将相同的输入传递到 ST_GeomFromLegacyBinary() 函数,例如:

      ST_area(ST_GeomFromLegacyBinary(<legacy_varbinary_value>))
  • ST_ExteriorRing() 和 ST_Polygon()ST_ExteriorRing()ST_Polygon() 现在仅接受多边形作为输入。以前,这些函数错误地接受其他几何体。

  • ST_Distance() – 根据 SQL/MM 规范的要求,如果其中一个输入是空几何体,ST_Distance() 函数现在将返回 NULL。以前,会返回 NaN

ANSI SQL 合规性

以下语法和行为问题已更正,以遵循 ANSI SQL 标准。

  • 强制转换()操作 从 REAL 或 DOUBLE 强制转换到 DECIMAL 现在符合 SQL 标准。–例如,cast (double '100000000000000000000000000000000' as decimal(38)) 之前返回了 100000000000000005366162204393472,但现在返回了 100000000000000000000000000000000

  • 加入... USING – 现在符合标准 SQL 语义。JOIN ... USING以前,JOIN ... USING 要求限定列中的表名称,而来自两个表的列将在输出中存在。表资格认证现在无效,并且列在输出中只出现一次。

  • ROW type textals removed (删除的 ROW 类型文本) 不再支持 – ROW 类型文本格式。ROW<int, int>(1, 2)请改用语法 ROW(1 int, 2 int)

  • log() 函数 – 以前,在违反 SQL 标准的情况下,log() 函数中参数的顺序颠倒。这会导致 log() 在将查询转换到其他 SQL 实现或从其他 SQL 实现中转换时返回错误的结果。与 log(x, b) 等效的是 ln(x) / ln(b)

  • 分组聚合语义 – 分组聚合使用 IS NOT DISTINCT FROM 语义而不是相等性语义。分组聚合现在返回正确的结果,并在对 NaN 浮点值进行分组时显示改进的性能。支持对包含 null 值的映射、列表和行类型进行分组。

  • 不再允许使用带引号的类型 – 根据 ANSI SQL 标准,数据类型不能再包含在引号中。例如,SELECT "date" '2020-02-02' 不再是有效的查询。请使用语法 SELECT date '2020-02-02'

  • 匿名行字段访问 – 匿名行字段无法再使用语法 [.field0, .field1, ...] 进行访问。

替换的函数

以下函数不再受支持,并且已替换为产生相同结果的语法。

  • information_schema.__internal_partitions__ – 不再支持 __internal_partitions__ 的使用。对于等效的语法,请使用 SELECT * FROM "<table_name>$partitions"SHOW PARTITIONS。 有关更多信息,请参阅列出特定表的分区

  • 替换了地理空间函数 – 有关名称已更改的地理空间函数的列表,请参阅中的地理空间函数名称更改

Limits

引擎版本 2 中引入了以下限制,以确保查询不会由于资源限制而失败。Athena这些限制不可供用户配置。

  • 结果元素数 – 对于以下函数,n 的结果元素数限制为 10000 或更少:min(col, n)max(col, n)min_by(col1, col2, n)max_by(col1, col2, n)

  • GROUPING SETS 分组集中的最大切片数为 2048。–

  • 最大文本文件行长度 – 文本文件的默认最大行长度为 100 MB。

  • 序列函数最大结果大小 – 序列函数的最大结果大小为 50000 个条目。例如,SELECT sequence(0,45000,1) 成功,但 SELECT sequence(0,55000,1) 失败,并显示错误消息 The result of the sequence function must not have more than 50000 entries, 此限制适用于序列函数的所有输入类型,包括时间戳。