Athena 引擎版本 3 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Athena 引擎版本 3

Athena 引擎版本 3 也仍然採用持續整合方法,管理開放原始碼軟體,提高 TrinoPresto 專案的並行數,讓您可以更快速地使用到各種改善後的社群功能,並在 Athena 引擎中執行整合和調整。

此次推出的 Athena 引擎版本 3 支援 Athena 引擎版本 2 的所有功能。本文件會重點說明 Athena 引擎版本 2 與 Athena 引擎版本 3 之間的主要差異。如需詳細資訊,請參閱 AWS 大數據部落格文章「升級至 Athena 引擎版本 3,以提升查詢效能並存取更多分析功能」。

開始使用

若要開始使用,請建立使用 Athena 引擎版本 3 的新 Athena 工作群組,或將現有工作群組設定為使用版本 3。任何 Athena 工作群組都可以從引擎版本 2 升級為引擎版本 3,且不會中斷提交查詢的功能。

如需詳細資訊,請參閱變更 Athena 引擎版本

改善和新功能

所列之功能和更新內容包括 Athena 本身的功能改進,以及從開放原始碼 Trino 整合的功能改進。如需有關 SQL 查詢運算子和函數的詳盡清單,請參閱 Trino 文件

新增功能

Apache Spark 歸納演算法支援

Athena 可讀取 Spark 雜湊演算法產生的儲存貯體。若要指定最初由 Spark 雜湊演算法撰寫該資料,請將 ('bucketing_format'='spark') 放入 CREATE TABLE 陳述式的 TBLPROPERTIES 子句中。若未指定此屬性,則系統會使用 Hive 雜湊演算法。

CREATE EXTERNAL TABLE `spark_bucket_table`( `id` int, `name` string ) CLUSTERED BY (`name`) INTO 8 BUCKETS STORED AS PARQUET LOCATION 's3://DOC-EXAMPLE-BUCKET/to/bucketed/table/' TBLPROPERTIES ('bucketing_format'='spark')

新增的函數

本節中的函數是 Athena 引擎版本 3 中新增的函數。

彙總函數

listagg(x, separator) – 傳回串連的輸入值,由分隔符號字串分開。

SELECT listagg(value, ',') WITHIN GROUP (ORDER BY value) csv_value FROM (VALUES 'a', 'c', 'b') t(value);

陣列函數

contains_sequence(x, seq) – 如果陣列 x 包含所有陣列序列,並作為循序子集 (相同連續順序中的所有值),則會傳回 true。

SELECT contains_sequence(ARRAY [1,2,3,4,5,6], ARRAY[1,2]);

二進位函數

murmur3(二進制)-計算二進製文件的 128 位 MurmurHash 3 哈希值。

SELECT murmur3(from_base64('aaaaaa'));

轉換函數

format_number(number) – 傳回使用單位符號的格式化字串。

SELECT format_number(123456); -- '123K'
SELECT format_number(1000000); -- '1M'

日期和時間函數

timezone_hour(timestamp) – 傳回與時間戳記偏離的時區小時數。

SELECT EXTRACT(TIMEZONE_HOUR FROM TIMESTAMP '2020-05-10 12:34:56 +08:35');

timezone_minute(timestamp) – 傳回與時間戳記偏離的時區分鐘數。

SELECT EXTRACT(TIMEZONE_MINUTE FROM TIMESTAMP '2020-05-10 12:34:56 +08:35');

地理空間函數

to_encoded_polyline(Geometry) – 將 linestring 或 multipoint 編碼為 polyline。

SELECT to_encoded_polyline(ST_GeometryFromText( 'LINESTRING (-120.2 38.5, -120.95 40.7, -126.453 43.252)'));

from_encoded_polyline(varchar) – 將 polyline 解碼為 linestring。

SELECT ST_AsText(from_encoded_polyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@'));

幾何 (SphericalGeography) — 以 GeoJSON 格式傳回指定的球形地理位置。

SELECT to_geojson_geometry(to_spherical_geography(ST_GeometryFromText( 'LINESTRING (0 0, 1 2, 3 4)')));

from_geojson_geometry(varchar) – 以 GeoJSON 表示法傳回剝離非幾何鍵/值的球形地理類型物件。不支援 FeatureFeatureCollection

SELECT from_geojson_geometry(to_geojson_geometry(to_spherical_geography(ST_GeometryFromText( 'LINESTRING (0 0, 1 2, 3 4)'))));

geometry_nearest_points(Geometry, Geometry) – 傳回每個幾何形狀上互相最近的點。如果任一幾何形狀為空,則會傳回 NULL。否則,便會傳回由兩個 Point 物件組成的資料列,這兩個物件與幾何形狀上任兩點的距離為最小距離。第一個點來自第一個 Geometry 引數,第二個點來自第二個 Geometry 引數。如果有多個具有相同最小距離的配對,則會任意選擇一對。

SELECT geometry_nearest_points(ST_GeometryFromText( 'LINESTRING (50 100, 50 200)'), ST_GeometryFromText( 'LINESTRING (10 10, 20 20)'));

Set Digest 函數

make_set_digest(x) – 將 x 的所有輸入值撰寫成一個 Setdigest。

SELECT make_set_digest(value) FROM (VALUES 1, 2, 3) T(value);

字串函數

soundex(char) – 傳回包含字元音標表示法的字元串。

SELECT name FROM nation WHERE SOUNDEX(name) = SOUNDEX('CHYNA'); -- CHINA

concat_ws(string0, string1, ..., stringN) – 傳回串連的 string1, string2, ..., stringN (使用 string0 作分隔符號)。如果 string0 為 NULL,則傳回值為 NULL。系統會略過在分隔符號後以引數方式提供的任何 Null 值。

SELECT concat_ws(',', 'def', 'pqr', 'mno');

範圍函數

GROUPS – 新增對群組型範圍框的支援。

SELECT array_agg(a) OVER( ORDER BY a ASC NULLS FIRST GROUPS BETWEEN 1 PRECEDING AND 2 FOLLOWING) FROM (VALUES 3, 3, 3, 2, 2, 1, null, null) T(a);

效能改進

Athena 引擎版本 3 的效能改進包含以下內容。

  • 更快速的 AWS Glue 表格中繼資料擷取 — 涉及多個資料表的查詢將減少查詢規劃時間。

  • RIGHT JOIN 的動態篩選 – 現可針對具有相等聯結條件的右端聯結啟用動態篩選,如以下範例所示。

    SELECT * FROM lineitem RIGHT JOIN tpch.tiny.supplier ON lineitem.suppkey = supplier.suppkey WHERE supplier.name = 'abc';
  • 大型預備陳述式 – 預設 HTTP 請求/回應標頭大小已增加至 2 MB,以允許使用大型預備陳述式。

  • approx_percentile()approx_percentile 函數現在使用 tdigest 而不是 qdigest 來從分佈擷取近似分位數值。這會導致更高的效能以及更低的記憶體使用量。請注意,由於此變更,函數傳回的結果與 Athena 引擎版本 2 中的結果不同。如需詳細資訊,請參閱 approx_percentile 函數會傳回不同的結果

可靠性增強功能

Athena 引擎版本 3 的一般引擎記憶體用量和追蹤功能已改進。大型查詢較不易因節點當機而失敗。

查詢語法增強功能

INTERSECT ALL – 已新增對 INTERSECT ALL 的支援。

SELECT * FROM (VALUES 1, 2, 3, 4) INTERSECT ALL SELECT * FROM (VALUES 3, 4);

EXCEPT ALL – 已新增對 EXCEPT ALL 的支援。

SELECT * FROM (VALUES 1, 2, 3, 4) EXCEPT ALL SELECT * FROM (VALUES 3, 4);

RANGE PRECEDING – 已新增對範圍函數中 RANGE PRECEDING 的支援。

SELECT sum(x) over (order by x range 1 preceding) FROM (values (1), (1), (2), (2)) t(x);

MATCH_RECOGNIZE – 已新增對資料列模式比對的支援,如以下範例所示。

SELECT m.id AS row_id, m.match, m.val, m.label FROM (VALUES(1, 90),(2, 80),(3, 70),(4, 70)) t(id, value) MATCH_RECOGNIZE ( ORDER BY id MEASURES match_number() AS match, RUNNING LAST(value) AS val, classifier() AS label ALL ROWS PER MATCH AFTER MATCH SKIP PAST LAST ROW PATTERN (() | A) DEFINE A AS true ) AS m;

資料格式和資料類型增強功能

Athena 引擎版本 3 具有以下資料格式和資料類型增強功能。

  • LZ4 和 ZSTD – 已新增對讀取 LZ4 和 ZSTD 壓縮 Parquet 資料的支援。已新增對寫入 ZSTD 壓縮 ORC 資料的支援。

  • 符號連結型資料表 – 已新增對在 Avro 檔案上建立符號連結型資料表的支援。範例如下。

    CREATE TABLE test_avro_symlink ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' ... INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
  • SphericalGeography— 此 SphericalGeography 類型為地理座標上表示的空間圖徵提供原生支援 (有時稱為大地座標、緯度/經度或 LON/lat)。地理座標是以角度單位 (度) 來表示的球面座標。

    to_spherical_geography 函數會從幾何 (平面) 座標傳回地理 (球形) 座標,如以下範例所示。

    SELECT to_spherical_geography(ST_GeometryFromText( 'LINESTRING (-40.2 28.9, -40.2 31.9, -37.2 31.9)'));

重大變更

從 Athena 引擎版本 2 遷移至 Athena 引擎版本 3 時,特定變更可能會影響資料表結構描述、語法或資料類型用量。本節會列出相關的錯誤訊息,並提供建議的因應措施。

查詢語法變更

IGNORE NULLS 不能與非值視窗函數一起使用

錯誤訊息無法為 bool_or 函數指定 Null 處理方式子句。

原因IGNORE NULLS 現在只能與值函數 first_valuelast_valuenth_valueleadlag 一起使用。此變更之目的是符合 ANSI SQL 規格。

建議的解決方案:從查詢字符串中的非值視窗函數中移除 IGNORE NULLS

CONCAT 函數必須有兩個或多個引數

錯誤信息INVALID_FUNCTION_ARGUMENT: There must be two or more concatenation arguments (NVALID_FUNCTION_ARGUMENT:必須有兩個或多個串聯參數)

原因:先前,CONCAT 字串函數接受了單一引數。在 Athena 引擎版本 3 中,CONCAT 函數需要至少兩個引數。

建議的解決方案:將出現次數從 CONCAT(str) 變更為 CONCAT(str, '')

在 Athena 引擎版本 3 中,函數中不可超過 127 個引數。如需詳細資訊,請參閱 函數呼叫的引數過多

approx_percentile 函數會傳回不同的結果

approx_percentile 函數會在 Athena 引擎版本 3 中傳回的結果與 Athena 引擎版本 2 中傳回的結果不同。

錯誤訊息:無。

原因approx_percentile 函數可能因版本變更而變更。

重要

由於 approx_percentile 函數的輸出是近似值,並且近似值可能會從一個版本變更為下一個版本,因此關鍵應用程式不得倚賴 approx_percentile 函數。

建議的解決方案:若要將 Athena 引擎版本 2 行為估算為 approx_percentile,您可以在 Athena 引擎版本 3 中使用不同的函數組。例如,假設您在 Athena 引擎版本 2 中有下列查詢:

SELECT approx_percentile(somecol, 2E-1)

若要估計 Athena 引擎版本 3 中的相同輸出,您可以嘗試使用 qdigest_aggvalue_at_quantile 函數,如下列範例所示。請注意,即使使用此解決方法,也不能保證行為相同。

SELECT value_at_quantile(qdigest_agg(somecol, 1), 2E-1)

地理空間函數不支援 varbinary 輸入

錯誤訊息FUNCTION_NOT_FOUND for st_XXX

原因:一些地理空間函數不再支援舊版 VARBINARY 輸入類型或與文字相關的函數簽章。

建議的解決方案:使用地理空間函數將輸入類型轉換為受支援的類型。錯誤訊息會指出受支援的輸入類型。

在 GROUP BY 子句中,巢狀資料欄必須使用雙引號

錯誤訊息"column_name"."nested_column" 必須是彙總表達式,或出現在 GROUP BY 子句中

原因:Athena 引擎版本 3 要求 GROUP BY 子句中的巢狀資料欄名稱必須加上雙引號。例如,下列查詢會產生錯誤,因為在 GROUP BY 子句中,user.name 未使用雙引號。

SELECT "user"."name" FROM dataset GROUP BY user.name

建議的解決方案:在 GROUP BY 子句中的巢狀資料欄名稱周圍使用雙引號,如下列範例所示。

SELECT "user"."name" FROM dataset GROUP BY "user"."name"

在冰山表上使用 OPTIMIZE 時出 FilterNode 現意外錯誤

錯誤訊息在計劃中 FilterNode發現未預期;可能連接器無法處理提供的 WHERE 運算式。

原因:在 Iceberg 表上運行的OPTIMIZEWHERE句使用了在其過濾器表達式中包含非分區列的子句。

建議的解決方案OPTIMIZE陳述式僅支援按分割區進行篩選。當您在分區資料表OPTIMIZE上執行時,在WHERE子句中只包含資料分割資料行。如果您OPTIMIZE在非資料分割資料表上執行,請勿指定子WHERE句。

Log() 函數引數的順序

在 Athena 引擎第 2 版中,log() 函數的引數順序為 log(value, base)。在 Athena 引擎第 3 版中,此順序已變更為 log(base, value),以符合 SQL 標準。

Minute() 函數不支援 interval year to month

錯誤訊息Unexpected parameters (interval year to month) for function minute.(Minute 函數的意外參數 (間隔使用年份和月份)。) Expected: minute(timestamp with time zone) , minute(time with time zone) , minute(timestamp) , minute(time) , minute(interval day to second). (函數 minute 出現未預期參數 (interval year to month)。預期:minute(timestamp with time zone)、minute(time with time zone)、minute(timestamp)、minute(time)、minute(interval day to second)。)

原因:在 Athena 引擎版本 3 中,已依據 ANSI SQL 規格,更精確地為 EXTRACT 執行類型檢查。

建議的解決方案:更新查詢,以確保類型與建議的函數簽章相符。

ORDER BY 表達式必須出現在 SELECT 清單中。

錯誤訊息For SELECT DISTINCT, ORDER BY expressions must appear in SELECT list (若為 SELECT DISTINCT,ORDER BY 表達式必須出現在 SELECT 清單中)

原因SELECT 子句中使用了不正確的資料表別名方式。

建議的解決方案:再次檢查 ORDER BY 表達式中的所有資料欄是否在 SELECT DISTINCT 子句中皆具有正確參考。

比較從子查詢傳回的多個資料欄時,查詢失敗

範例錯誤訊息值表達式和子查詢的結果必須是相同的類型:資料列(varchar, varchar) 與資料列(row(varchar, varchar))

原因:由於 Athena 引擎版本 3 中的語法更新,當查詢嘗試比較子查詢傳回的多個值,而子查詢 SELECT 陳述式會包括其資料欄清單 (用括號) 時,就會發生此錯誤,如下列範例所示。

SELECT * FROM table1 WHERE (t1_col1, t1_col2) IN (SELECT (t2_col1, t2_col2) FROM table2)

解決方案:在 Athena 引擎版本 3 中,移除子查詢 SELECT 陳述式中資料欄清單周圍的括號,如下列更新的範例查詢所示。

SELECT * FROM table1 WHERE (t1_col1, t1_col2) IN (SELECT t2_col1, t2_col2 FROM table2)

SKIP 是 DML 查詢的保留字詞

單字 SKIP 是 DML 查詢的保留字詞,例如 SELECT。若要在 DML 查詢中將 SKIP 用作識別符,請將其括在雙引號中。

如需有關 Athena 中保留字詞的詳細資訊,請參閱 保留的關鍵字

時間歷程已取代 SYSTEM_TIME 和 SYSTEM_VERSION 子句。

錯誤訊息mismatched input 'SYSTEM_TIME'. (不相符的輸入 'SYSTEM_TIME'。) 預期:'TIMESTAMP'、'VERSION'

原因:在 Athena 引擎版本 2 中,Iceberg 資料表使用了 FOR SYSTEM_TIME AS OFFOR SYSTEM_VERSION AS OF 子句作為時間戳記和版本時間歷程。Athena 引擎版本 3 使用了 FOR TIMESTAMP AS OFFOR VERSION AS OF 子句。

建議的解決方案:更新 SQL 查詢,以使用 TIMESTAMP AS OFVERSION AS OF 子句作為時間歷程操作,如下列範例所示。

依時間戳記的時間歷程:

SELECT * FROM TABLE FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)

依版本的時間歷程:

SELECT * FROM TABLE FOR VERSION AS OF 949530903748831860

陣列建構的引數過多

錯誤訊息TOO_MANY_ARGUMENTS:陣列建構的引數過多。

原因:陣列建構中的元素數目上限現已設定為 254。

建議的解決方案:將元素分解為多個陣列,每個陣列具有 254 個或更少的元素,並使用 CONCAT 函數來串連陣列,如下列範例所示。

CONCAT( ARRAY[x1,x2,x3...x254], ARRAY[y1,y2,y3...y254], ... )

不允許使用零長度分隔的識別碼

錯誤訊息Zero-length delimited identifier not allowed. (不允許使用零長度分隔的識別碼。)

原因:查詢使用了空白字串作為資料欄別名。

建議的解決方案:更新查詢以使用非空白的資料欄別名。

資料處理變更

儲存貯體驗證

錯誤訊息HIVE_INVALID_BUCKET_FILES:Hive 資料表已損壞。

原因:該資料表可能已損壞。為確定歸納資料表的查詢正確性,Athena 引擎版本 3 會在歸納資料上啟用額外的驗證,以確保查詢的正確性並避免執行期發生非預期的失敗。

建議的解決方案:使用 Athena 引擎版本 3 重新建立資料表。

現在,將結構轉換為 JSON,會傳回欄位名稱

當您在 Athena 引擎第 3 版的 SELECT 查詢中將 struct 轉換為 JSON 時,該轉換現在會傳回欄位名稱和值 (例如 "useragent":null) 而非只是值 (例如,null)。

Iceberg 資料表資料欄層級安全性強制執行變更

錯誤信息Access Denied: Cannot select from columns (存取遭拒:無法從資料欄中選取)

原因:Iceberg 資料表是在 Athena 之外建立的,並使用早於 0.13.0 的 Apache Iceberg SDK 版本。由於舊版 SDK 不會在中填入資料行 AWS Glue,因此 Lake Formation 無法判斷授權存取的資料行。

建議的解決方案:使用 Athena ALTER TABLE SET PROPERTIES 陳述式執行更新,或使用最新的 Iceberg SDK 來修正資料表並更新 AWS Glue中的資料欄資訊。

List 資料類型中的 Null 值現已傳播至 UDF

錯誤訊息Null Pointer Exception (Null 指標異常情形)

原因:如果您使用 UDF 連接器並已執行使用者定義的 Lambda 函數,則此問題可能會對您產生影響。

Athena 引擎版本 2 會篩選出 List 資料類型中已傳遞給使用者定義函數的 Null 值。在 Athena 引擎版本 3 中,會保留 Null 值並傳遞給 UDF。如果 UDF 嘗試在未檢查的情況下取消參考 Null 元素,這可能會導致 Null 指標異常情形。

例如,若您在如 DynamoDB 等原始資料來源中具有資料 [null, 1, null, 2, 3, 4],則系統會將以下項目傳遞至使用者定義的 Lambda 函數:

Athena 引擎版本 2[1,2,3,4]

Athena 引擎版本 3[null, 1, null, 2, 3, 4]

建議的解決方案:確保使用者定義的 Lambda 函數會處理 List 資料類型中的 Null 元素。

字元陣列中的子字串不再包含已填補的空格

錯誤訊息:No error is thrown, but the string returned no longer contains padded spaces. (未擲回任何錯誤,但傳回的字串不再包含已填補的空格。) 例如,substr(char[20],1,100) 現在會傳回長度為 20 而非 100 的字串。

建議的解決方案:無需採取任何動作。

不支援的十進位資料欄類型強制轉換

錯誤消息HIVE_CURSOR_ 錯誤:無法讀取實木複合地板文件:s3://DOC-EXAMPLE-BUCKET/ 路徑/文件名. 鑲木地板不支持的列類型(varchar)的實木地板列([列名]

原因:當嘗試將資料類型強制從 varchar 轉換為 decimal 時,Athena 引擎版本 2 偶有成功 (但經常失敗)。由於 Athena 引擎版本 3 會有類型驗證,即會在嘗試讀取值之前先檢查類型是否相容,因此類型嘗試強制執行現在總會失敗。

建議的解決方案:對於 Athena 引擎版本 2 和 Athena 引擎版本 3,請修改中的結構描述, AWS Glue 以使用數值資料類型,而不是 Parquet 檔案中的十進位資料欄。varchar重新編目資料並確定新的資料欄資料類型為 decimal 類型,或在 Athena 中手動重新建立資料表,然後使用語法 decimal(precision, scale) 指定資料欄的 decimal 資料類型。

Float 或 double NaN 值不能再轉換為 bigint

錯誤訊息INVALID_CAST_ARGUMENT:無法將 real/double NaN 轉換為 bigint

原因:在 Athena 引擎版本 3 中,NaN 無法再以 bigint 的形式轉換為 0。

建議的解決方案:當您轉換為 bigint 時,請確保 NaN 值不存在於 floatdouble 資料欄。

uuid() 函數傳回類型變更

下列問題會影響資料表和檢視。

錯誤訊息不支援的 Hive 類型:uuid

原因:在 Athena 引擎版本 2 中,uuid() 函數傳回了一個字串,但在 Athena 引擎版本 3 中,它會傳回一個偽隨機產生的 UUID (類型 4)。由於 Athena 中不支援 UUID 資料欄資料類型,因此無法在 CTAS 查詢中直接使用 uuid() 函數,以在 Athena 引擎版本 3 中產生 UUID 資料欄。

例如,下列 CREATE TABLE 陳述式在 Athena 引擎版本 2 中成功完成;但在 Athena 引擎版本 3 中,則會傳回 NOT_SUPPORTED: 不支援的 Hive 類型:uuid

CREATE TABLE uuid_table AS SELECT uuid() AS myuuid

同樣地,下列 CREATE VIEW 陳述式在 Athena 引擎版本 2 中成功完成;但在 Athena 引擎版本 3 中,則會傳回 資料欄 myuuid 的資料欄類型無效:不支援的 Hive 類型: uuid

CREATE VIEW uuid_view AS SELECT uuid() AS myuuid

在 Athena 引擎版本 3 中查詢在 Athena 引擎版本 2 中建立的檢視時,會發生類似下列情況的錯誤:

VIEW_IS_STALE:行 1:15::檢視 'awsdatacatalog.mydatabase.uuid_view' 已過時或處於無效狀態:從位置 0 查詢檢視投影之 uuid 類型的資料欄 [myuuid] 無法強制轉換為儲存在檢視定義中的 varchar 類型的資料欄 [myuuid]

建議的解決方案:建立資料表或檢視時,請使用 cast() 函數將 uuid() 的輸出轉換為 varchar,如下列範例所示:

CREATE TABLE uuid_table AS SELECT CAST(uuid() AS VARCHAR) AS myuuid
CREATE VIEW uuid_view AS SELECT CAST(uuid() AS VARCHAR) AS myuuid

CHAR 和 VARCHAR 強制問題

如果您在 Athena 引擎版本 3 中遇到 varcharchar 強制問題,請使用本節的解決方法。如果您無法使用這些因應措施,請聯絡。 AWS Support

混合 CHAR 和 VARCHAR 輸入的 CONCAT 函數失敗

問題:Athena 引擎版本 2 會成功執行下列查詢。

SELECT concat(CAST('abc' AS VARCHAR(20)), '12', CAST('a' AS CHAR(1)))

但是,在 Athena 引擎版本 3 上,相同的查詢會失敗,並顯示下列情況:

錯誤訊息FUNCTION_NOT_FOUND:行 1:8:函數 concat 的意外參數 (varchar(20), varchar(2), char(1))。預期:concat(char(x), char(y)), concat(array(E), E) E、concat(E, array(E)) E、concat(array(E)) E、concat(varchar)、concat(varbinary)

建議的解決方案:使用 concat 函數時varchar,可轉換為 char 或 ,但不能混合兩者。

SQL || CHAR 和 VARCHAR 輸入的串聯失敗

在 Athena 引擎版本 3 中,雙垂直長條圖 || 串聯操作員要求 varchar 做為輸入。輸入不能是 varcharchar 類型的組合。

錯誤訊息TYPE_NOT_FOUND:行 1:26:未知類型:char(65537)

原因:使用 || 來串連 charvarchar 的查詢可能會產生錯誤,如下列範例所示。

SELECT CAST('a' AS CHAR) || CAST('b' AS VARCHAR)

建議的解決方案:串連 varcharvarchar,如下列範例所示。

SELECT CAST('a' AS VARCHAR) || CAST('b' AS VARCHAR)
CHAR 和 VARCHAR UNION 查詢失敗

錯誤訊息NOT_SUPPORTED:不支援的 Hive 類型:char(65536)。支援的 CHAR 類型:CHAR(<=255)

原因:嘗試合併 charvarchar 的查詢,如下列範例所示:

CREATE TABLE t1 (c1) AS SELECT CAST('a' as CHAR) as c1 UNION ALL SELECT CAST('b' AS VARCHAR) AS c1

建議的解決方案:在範例查詢中,將 'a' 轉換為 varchar 而不是 char

CHAR 或 VARCHAR 強制後不需要的空白空格

在 Athena 引擎版本 3 中,當 char(X)varchar 資料在形成陣列或單一資料欄時強制轉換為單一類型,則 char(65535) 是目標類型,而且每個欄位都包含許多不需要的尾隨空格。

原因:Athena 引擎版本 3 強制將 varcharchar(X) 轉換為 char(65535),然後右邊填補了空格的資料。

建議的解決方案:明確地將每個欄位轉換為 varchar

時間戳記變更

將 Timestamp with Time Zone 轉換為 varchar 的行為變更

在 Athena 引擎版本 2 中,將 Timestamp with time zone 轉換為 varchar 時,會導致部分時區常值變更 (例如,US/Eastern 變更為 America/New_York)。Athena 引擎版本 3 不會發生此行為。

日期時間戳記溢出會擲出錯誤

錯誤訊息Millis overflow: XXX (毫秒溢出:XXX)

原因:由於在 Athena 引擎版本 2 中未檢查 ISO 8601 日期是否溢出,因此部分日期會產生負數時間戳記。Athena 引擎版本 3 會檢查此溢出,並擲出例外狀況。

建議的解決方案:確保時間戳記在範圍內。

不支援具有 TIME 的政治時區

錯誤訊息INVALID LITERAL (無效常值)

原因:如 SELECT TIME '13:21:32.424 America/Los_Angeles' 等查詢。

建議的解決方案:避免使用具有 TIME 的政治時區。

Timestamp 資料欄中的精確度不符會造成序列化錯誤

錯誤訊息SERIALIZATION_ERROR: Could not serialize column 'COLUMNZ' of type 'timestamp(3)' at position X:Y (SERIALIZATION_ERROR:無法在位置 X:Y 處序列化類型為 'timestamp(3)' 的資料欄 'COLUMNZ')

COLUMNZ 是造成該問題之資料欄的輸出名稱。數字 X:Y 表示資料欄在輸出中的位置。

原因:Athena 引擎版本 3 會執行檢查,以確保資料中時間戳記的精確度與資料表規格中資料欄資料類型指定的精確度相同。目前,此精確度一直是 3。如果資料的精確度大於此值,則查詢會失敗,且系統會指出錯誤。

建議的解決方案:檢查您的資料,以確保您的時間戳記為毫秒精確度。

Iceberg 表的 UNLOAD 和 CTAS 查詢中的時間戳記精度不正確

錯誤訊息時間戳記 (6) 的時間戳記精確度不正確;設定的精確度為毫秒

原因:Athena 引擎版本 3 會執行檢查,以確保資料中時間戳記的精確度與資料表規格中資料欄資料類型指定的精確度相同。目前,此精確度一直是 3。如果資料的精確度大於此值 (例如以微秒而非毫秒),則查詢會失敗且系統會指出錯誤。

解決方案:若要解決此問題,請先將時間戳記精確度 CAST 為 6,如下列建立 Iceberg 資料表的 CTAS 範例所示。請注意,必須將精確度指定為 6 而不是 3,以避免錯誤:Iceberg 不支援時間戳記精度 (3)

CREATE TABLE my_iceberg_ctas WITH (table_type = 'ICEBERG', location = 's3://DOC-EXAMPLE-BUCKET/table_ctas/', format = 'PARQUET') AS SELECT id, CAST(dt AS timestamp(6)) AS "dt" FROM my_iceberg

然後,由於 Athena 不支援時間戳記 6,因此請將值再次轉換為時間戳記 (例如,在檢視中)。下列範例從 my_iceberg_ctas 資料表建立檢視。

CREATE OR REPLACE VIEW my_iceberg_ctas_view AS SELECT cast(dt AS timestamp) AS dt FROM my_iceberg_ctas

現在,將 ORC 檔案中的 Long 類型讀取為 Timestamp 會造成不正確的 ORC 檔案錯誤,反之亦然

錯誤訊息Error opening Hive split ‘FILE (SPLIT POSITION)’ Malformed ORC file. (開啟 Hive 分割 ‘FILE (SPLIT POSITION)’ 格式不正確的 ORC 檔案時發生錯誤。) Cannot read SQL type timestamp from ORC stream .long_type of type LONG (開啟 Hive 分割 ‘FILE (SPLIT POSITION)’ 不正確的 ORC 檔案時發生錯誤。無法從 LONG 類型的 ORC 串流 .long_type 讀取 SQL 類型的時間戳記)

原因:Athena 引擎版本 3 現在會拒絕從 Long 資料類型隱含強制轉換至 Timestamp,或從 Timestamp 轉換至 Long。過去,若 Long 值為 epoch 毫秒,便會被隱含強制轉換為時間戳記。

建議的解決方案:使用 from_unixtime 函數來明確轉換資料欄,或者使用 from_unixtime 函數為以後的查詢建立一個額外的資料欄。

不支援 time 和 interval year to month

錯誤訊息TYPE MISMATCH (類型不相符)

原因:Athena 引擎版本 3 不支援 time 和 interval year to month (例如 SELECT TIME '01:00' + INTERVAL '3' MONTH)。

Int96 Parquet 格式的時間戳記溢出

錯誤信息無效的 timeOfDay納諾

原因int96 Parquet 格式的時間戳記溢出。

建議的解決方案:辨識發生問題的特定檔案。然後使用知名的實木複合地板資料庫再次產生資料檔案,或使用 Athena CTAS。 up-to-date如果問題仍持續發生,請聯絡 Athena 支援,並告知我們產生資料檔案的方法。

從字串轉換為時間戳記時,日期和時間值之間需要的空格

錯誤訊息INVALID_CAST_ARGUMENT:值無法轉換為時間戳記

原因:Athena 引擎版本 3 不再接受連字號做為輸入字串中日期和時間值之間的有效分隔符。cast例如,下列查詢適用於 Athena 引擎版本 2,但不適用於 Athena 引擎版本 3:

SELECT CAST('2021-06-06-23:38:46' AS timestamp) AS this_time

建議的解決方案:在 Athena 引擎版本 3 中,將日期與時間之間的連字號取代為空格,如下列範例所示。

SELECT CAST('2021-06-06 23:38:46' AS timestamp) AS this_time

to_iso8601() 時間戳記傳回值變更

錯誤訊息:無

原因:在 Athena 引擎版本 2 中,即使傳遞給 to_iso8601 函數的值不包含時區,該函數也會傳回帶有時區的時間戳記。在 Athena 引擎版本 3 中,只有當傳遞的引數包含時區時,to_iso8601 函數才會傳回時間戳記與時區。

例如,下列查詢會將目前日期傳遞給 to_iso8601 函數兩次:首先是做為具有時區的時間戳記,然後是做為時間戳記。

SELECT TO_ISO8601(CAST(CURRENT_DATE AS TIMESTAMP WITH TIME ZONE)), TO_ISO8601(CAST(CURRENT_DATE AS TIMESTAMP))

下列輸出會顯示每個引擎中的查詢結果。

Athena 引擎版本 2:

# _col0 _col1
1

2023-02-24T00:00:00.000Z

2023-02-24T00:00:00.000Z

Athena 引擎版本 3:

# _col0 _col1
1

2023-02-24T00:00:00.000Z

2023-02-24T00:00:00.000

建議的解決方案:要複製先前的行為,您可以先將時間戳記值傳遞至 with_timezone 函數,然後再將其傳遞給 to_iso8601,如下列範例所示:

SELECT to_iso8601(with_timezone(TIMESTAMP '2023-01-01 00:00:00.000', 'UTC'))

結果

# _col0
1 2023-01-01T00:00:00.000Z

at_timezone() 第一個參數必須指定一個日期

問題:在 Athena 引擎版本 3 中,at_timezone 函數無法將 time_with_timezone 值做為第一個參數。

原因:如果沒有日期資訊,則無法判斷傳遞的值是夏令時間還是標準時間。例如,at_timezone('12:00:00 UTC', 'America/Los_Angeles') 並不明確,因為無法判斷傳遞的值是太平洋夏令時間 (PDT) 還是太平洋標準時間 (PST)。

限制

Athena 引擎版本 3 有以下限制。

  • 查詢效能 – 許多查詢在 Athena 引擎版本 3 上的執行速度更快,但部分查詢計畫可能與 Athena 引擎版本 2 不同。因此,部分查詢的延遲或成本可能有所不同。

  • Trino 和 Presto 連接器 – 不支援 TrinoPresto 連接器。使用 Amazon Athena 聯合查詢來連接資料來源。如需詳細資訊,請參閱 使用 Amazon Athena 聯合查詢

  • 容錯執行 – 不支援 Trino 容錯執行 (Trino Tardigrade)。

  • 函數參數限制 – 函數使用的參數不能超過 127 個。如需詳細資訊,請參閱 函數呼叫的引數過多

Athena 引擎版本 2 中引入了下列限制,以確保查詢不會因資源限制而失敗。使用者無法設定這些限制。

  • 結果元素的數量 – 下列函數的結果元素 n 的數量限制為 10,000 或更少:min(col, n)max(col, n)min_by(col1, col2, n) 以及 max_by(col1, col2, n)

  • GROUPING SETS – 分組集中的配量數目上限為 2048。

  • 文字檔案一行長度上限 – 文字檔案預設的一行長度上限為 200 MB。

  • 序列函數結果大小上限 – 序列函數的結果大小上限為 50,000 個項目。例如:SELECT sequence(0,45000,1) 成功,但 SELECT sequence(0,55000,1) 失敗並顯示錯誤訊息 The result of the sequence function must not have more than 50000 entries (序列函數的結果不能有 50,000 個以上項目)。此限制適用於序列函數 (包括時間戳記) 的所有輸入類型。