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

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

Athena 引擎版本参考

本节列出了自 Athena 引擎版本 1 以来对 Athena 查询引擎所做的更改。Athena 发动机版本 1 是雅典娜的初始发动机版本,并基于Presto 0.172.

Athena 引擎版本 2

Athena 引擎版本 2,这是基于Presto 0.217推出了以下更改。目前,Athena 引擎版本 2 在支持 Athena 的地区中可用,包括非洲(开普敦)、亚太地区(悉尼)、亚太地区(东京)、亚太地区(亚太地区(悉尼)、亚太地区(亚太地区(东京)、亚太地区(亚太地区)、亚太地区(亚太地区(亚太地区(亚)、亚太地区(亚太地区(亚)、亚太地区(亚太地区(亚)、亚太地区(亚AmazonGovCloud(美国东部)、AmazonGovCloud(美国西部)、中国(宁夏)、欧洲(弗吉尼亚北部)、美国东部(美国俄亥俄)、美国东部(美国俄亥俄)、美国东部(弗吉尼亚北部)、美国东部(俄亥俄)、美国东部(美国俄亥俄)、美国东部(美国东部(美国东部(美国俄亥俄亥俄州)、美国东部、美国东部、美国东部(美国东部(美国俄亥俄州)、美国东部(美国俄州)、美国东部(美国东部(美国俄亥俄州)、美国东部(美国俄州)、美国东部(美国俄州)、美国东部雷冈)。

改进和新功能

  • 联合查询— Athena 引擎版本 2 支持联合查询。有关更多信息,请参阅使用 Amazon Athena 联合查询

  • 地理空间函数— 添加了超过 25 个地理空间函数。有关更多信息,请参阅Athena 引擎版本 2 中的新地理空间函数

  • 嵌套架构— 添加了对读取嵌套架构的 Support,从而降低了成本。

  • 架构演变支持— 添加了针对 Hibly 格式的数据的支持。

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

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

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

分组、联接和子查询改进

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

  • 关联的子查询— 添加了对相关子查询的支持IN谓词和需要强制的相关子查询。

  • 交叉联接— 添加了对的支持CROSS JOIN反对LATERAL派生表。

  • 对集进行分组— 添加了对的支持ORDER BY子句在聚合中使用GROUPING SETS.

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

  • 半连接中的 Null 值— 添加了对半连接左侧空值的支持(即IN谓词与子查询)。

  • 空间联接— 添加了对广播空间连接和空间左连接的支持。

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

  • INT 表示整数— 添加了对的支持INT作为INTEGER数据类型。

  • 间隔类型— 增加了对转换的支持INTERVAL类型。

  • IPADDRESRESS— 添加了一个新IPADDRESS类型来表示 IP 地址。增加了对在VARBINARY类型和IPADDRESS

  • 不同于— 已将添加到IS DISTINCT FROM支持JSONIPADDRESS类型。

  • Null 等效性检查— 相等检查中的空值ARRAYMAP, 和ROW现在支持数据结构。例如,表达式ARRAY ['1', '3', null] = ARRAY ['1', '2', null]返回false. 以前,空元素返回错误消息不支持比较.

  • 行类型强制— 现在允许在行类型之间进行强制,而不考虑字段名称。以前,只有当源类型中的字段名与目标类型匹配时,或者当目标类型具有匿名字段名时,才可强制转换为另一行类型。

  • 时间减— 为所有实现减法TIMETIMESTAMP类型。

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

  • VARDION 二进制连接— 增加了对的支持VARBINARY有效值。

函数的其他输入类型

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

  • 大约不同 ()大约不同 ()函数现在支持以下类型:INTEGERSMALLINTTINYINTDECIMALREALDATETIMESTAMPTIMESTAMP WITH TIME ZONETIMETIME WITH TIME ZONEIPADDRESS, 和CHAR.

  • 平均值 (), 总和 ()AVG ()SUM ()聚合函数现在支持INTERVAL数据类型。

  • lpad (), rpad ()lpadrpad函数现在工作VARBINARY输入。

  • 最小值 (), 最大值 ()min ()MAX ()聚合函数现在允许在查询分析时使用未知的输入类型,以便您可以将函数与NULL文本。

  • 正则表格替换 ()— 变体正则表格替换 ()函数,可以为每个替换执行 Lambda 函数。

  • 序列 ()— 已将添加到DATE的变体序列 ()函数,包括带有隐式一天步长增量的变体。

  • ST_A区()ST_A区()地理空间函数现在支持所有几何类型。

  • SUBSTR ()substr函数现在可以在VARBINARY输入。

  • 带有拉链 ()— 长度不匹配的数组现在可以与带有拉链 (). 缺少的仓位将用空填充。以前,传递不同长度的数组时会引发错误。这种更改可能会使得难以区分最初为空的值和添加的值来填充数组为相同长度的值。

新增函数

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

有关每种函数的更多信息,请访问 Presto 文档的对应链接。

聚合函数

减少 AGG ()

数组函数和运算符

数组排序 ()-这个函数的变体添加了一个 Lambda 函数作为比较器。

ngram ()

二进制函数和运算符

来自大字母-32 ()

来自

来自

Hmac_md5 ()

哈马克沙 1 ()

沙哈 256 ()

哈马克 ()

幽灵散列 V2_32 ()

幽灵散列 V2_64 ()

大型字段 32 ()

()

发送给我们的

日期与时间函数和运算符

毫秒 ()

解析持续时间 ()

至毫秒 ()

映射函数和运算符

多地图从条目 ()

数学函数和运算符

反正常 cdf ()

威尔逊间距下 ()

威尔逊间隔上 ()

分位数摘要函数

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

字符串函数和运算符

锤距离 ()

拆分到多个映射 ()

性能改进

在 Athena 引擎版本 2 中,以下功能的性能得到了改进。

查询性能
  • 分桶表— 在正在写入的数据已经适当分区(例如,当输出来自分段连接时)时,改进了写入分段表的性能。

  • 区分— 改进了一些使用DISTINCT.

  • 过滤和投影操作— 过滤器和投影操作现在始终由列处理(如果可能)。引擎在有效的地方自动利用字典编码。

  • 聚合交换— 改进了通过收集交换查询的性能。

  • 全球聚合— 改进了执行过滤全局聚合的某些查询的性能。

  • 分组集, 多维数据集, 汇总— 改进了涉及GROUPING SETSCUBE或者ROLLUP,您可以使用它来聚合单个查询中的多组列。

  • 高度选择性过滤器— 改进了使用高度选择性筛选器的查询的性能。

  • 联接和聚合操作— 性能JOINAGGREGATE操作得到了增强。

  • LIKE— 改进了使用的查询的性能LIKE列上的谓词information_schema表。

  • ORDER BY 和限制— 改进了计划、性能和内存使用情况的查询涉及ORDER BYLIMIT以避免不必要的数据交换。

  • 排序依据ORDER BY操作现在默认情况下分布,从而启用更大ORDER BY要使用的子句。

  • ROW 类型转换— 改进了转换时的性能ROW类型。

  • 结构类型— 改进了处理结构类型并包含扫描、连接、聚合或表写入的查询的性能。

  • UNION— 改进了对的性能UNION查询。

查询计划性能
  • 规划性能— 改进了对包含大量列的多个表的查询的规划性能。

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

  • 用于铸造的谓词按下支持— Support 谓词按下<column> IN <values list>谓词,其中值列表中的值需要进行转换以匹配列的类型。

  • 谓词推理和按下— 对于使用<symbol> IN <subquery>谓词。

联接性能
  • 使用映射列连接— 改进了包含映射列的连接和聚合的性能。

  • 单独使用非相等条件的连接— 通过使用嵌套循环连接而不是散列连接来改进仅具有非相等条件的连接的性能。

  • 外部联接— 对于涉及外连接的查询,现在会自动选择连接分配类型。

  • 函数连接上的范围— 改进了连接的性能,其中条件是函数的范围(例如,a JOIN b ON b.x < f(a.x) AND b.x > g(a.x))。

子查询性能
  • 关联的存在子查询— 改进了关联的性能EXISTS子查询。

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

  • 关联的子查询— 改进了包含不等式的相关子查询的性能。

  • 子查询上的计数 (*) 聚合— 改进了count(*)聚合具有已知常量基数的子查询。

  • 外部查询过滤器传播— 在可以将外部查询的筛选器传播到子查询时,改进了相关子查询的性能。

功能性能
  • 聚合窗口函数— 改进了聚合窗口函数的性能。

  • 元素 _at ()— 改进了element_at()将地图设置为恒定时间,而不是与地图大小成正比。

  • GROUPING ()— 改进了涉及grouping().

  • JSON 铸造— 改进了从铸造的性能JSONARRAY或者MAP类型。

  • 地图返回函数— 改进了返回映射的函数的性能。

  • 地图到地图转换— 改进了地图到地图转换的性能。

  • 最小值 () 和最大值 ()min()max()函数已经过优化,以避免不必要的对象创建,从而减少垃圾收集开销。

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

  • 窗口函数— 改进了包含具有相同窗口函数的查询的性能PARTITION BYORDER BY子句。

  • 窗口函数— 改进了某些窗口函数的性能(例如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_A距离 ()— 改进了涉及ST_Distance()function.

  • ST_ 交叉点 ()— 优化ST_Intersection()函数用于与坐标轴对齐的矩形(例如,由ST_Envelope()bing_tile_polygon()函数)。

映射函数

  • 改进了地图下标的性能O(n)O(1)在所有情况下. 以前,只有某些功能和读者生成的地图才能利用这一改进。

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

铸造

  • 增加了投射到JSONfromREALTINYINT或者SMALLINT.

  • 现在,您可以将JSONROW即使JSON不包含ROW.

  • 提高了性能CAST(json_parse(...) AS ...).

  • 改进了铸造的性能JSONARRAY或者MAP类型。

新 JSON 函数

重大更改

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

错误修复

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

  • json_parse () 不再忽略尾随字符— 以前,输入(如[1,2]abc将成功解析为[1,2]. 使用尾随字符现在会生成错误消息无法将 '[1, 2] abc' 转换为 JSON.

  • 圆角 () 十进制精度校正round(x, d)现在正确舍入xWHENx是 DECIMAL 或当x是一个比例为 0 的十进制,d是负整数。以前,在这些情况下没有进行四舍五入。

  • 圆角 (x, d) 和截断 (x, d)— 参数d函数的签名round(x, d)truncate(x, d)现在的类型INTEGER. 以前,d类型可能是BIGINT.

  • 带有重复键的 map ()map()现在会在重复键上引发错误,而不是静默地生成损坏的地图。当前使用重复键构建映射值的查询现在会失败,并显示错误。

  • 地图从条目 () 引发一个带有空条目的错误map_from_entries()现在会在输入数组包含空条目时引发错误。通过传递NULL作为一个值现在失败。

  • — 不能再创建具有不受支持的分区类型的表。

  • 改进统计函数的数值稳定性— 统计函数的数值稳定性corr()covar_samp()regr_intercept(), 和regr_slope()已改进。

  • 时区信息— 现在使用java.time软件包。

  • 间隔日至秒和间隔年至月数据类型的总和— 您无法再使用SUM(NULL)直接。为了使用SUM(NULL), 强制转换为NULL设置为数据类型,如BIGINTDECIMALREALDOUBLEINTERVAL_DAY_TO_SECOND或者INTERVAL_YEAR_TO_MONTH.

地理空间函数的更改

对的地理空间函数所做的更改包括以下各项。

  • 函数名更改— 某些函数名称已更改。有关更多信息,请参阅Athena 引擎版本 2 中的地理空间函数名称更改

  • VARBINARIN 输入VARBINARY类型不再直接支持地理空间函数的输入。例如,要直接计算几何的面积,现在必须将几何输入到VARCHAR或者GEOMETRY格式的日期和时间。解决方法是使用转换函数,如以下示例所示。

    • 使用ST_area()来计算VARBINARY输入,请将输入传递给ST_GeomFromBinary()首先,例如:

      ST_area(ST_GeomFromBinary(<wkb_varbinary_value>))
    • 使用ST_area()来计算VARBINARY输入,则将相同的输入传递给ST_GeomFromLegacyBinary()函数,例如:

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

  • ST_A距离 ()— 根据SQL/MM 规范ST_Distance()函数现在返回NULL(如果其中一个输入为空几何)。以前,NaN被返回。

ANSI SQL 合规性

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

  • Cast () 操作— 从真实或双精度到十进制的转换 () 操作现在符合 SQL 标准。例如,cast (double '100000000000000000000000000000000' as decimal(38))以前返回100000000000000005366162204393472但现在返回100000000000000000000000000000000.

  • 联接... ,使用JOIN ... USING现在符合标准 SQL 语义。以前,JOIN ... USING需要限定列中的表名,并且两个表中的列将出现在输出中。表限定现在无效,并且该列仅出现在输出中一次。

  • 删除了 ROW 类型的文字— ROW 类型的文字格式ROW<int, int>(1, 2)不再支持。使用语法ROW(1 int, 2 int)相反。

  • log () 函数— 以前,违反了 SQL 标准,log()函数被反转。这导致log()来返回不正确的结果,当查询被转换为或从其他 SQL 实现。等效于log(x, b)现在正确ln(x) / ln(b).

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

  • 不再允许带引号的类型— 根据 ANSI SQL 标准,数据类型不能再用引号括起来。例如,SELECT "date" '2020-02-02'不再是有效的查询。请改用语法SELECT date '2020-02-02'.

  • 匿名行字段访问— 匿名行字段不能再通过使用语法 [.field0, .field1, ...]。

  • 复杂的分组操作— 复杂的分组操作GROUPING SETSCUBE, 和ROLLUP不支持对由输入列组成的表达式进行分组。只允许使用列名。

已更换函数

以下函数不再受支持,已被生成相同结果的语法替换。

Limits

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

  • 结果元素的数量— 结果元素的数量n对于以下功能,限制在 10,000 或更少:min(col, n)max(col, n)min_by(col1, col2, n), 和max_by(col1, col2, n).

  • 对集进行分组— 分组集中的最大切片数为 2048。

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

  • 序列函数最大结果大小— 序列函数的最大结果大小为 50000 个条目。例如,SELECT sequence(0,45000,1)成功,但SELECT sequence(0,55000,1)失败,并显示错误消息序列函数的结果不得超过 50000 个条目. 此限制适用于序列函数的所有输入类型,包括时间戳。