本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用蜂巢檢視
您可以使用 Athena 來查詢在外部 Apache Hive 中繼存放區中的現有檢視。Athena 會 on-the-fly 在執行階段為您翻譯檢視,而不需變更原始檢視或儲存翻譯。
例如,假設您有一個 Hive 檢視 (如以下所示),其使用了 Athena 不支援的語法,如 LATERAL VIEW explode()
:
CREATE VIEW team_view AS SELECT team, score FROM matches LATERAL VIEW explode(scores) m AS score
Athena 將 Hive 檢視查詢字串翻譯為 Athena 可以執行的以下陳述式:
SELECT team, score FROM matches CROSS JOIN UNNEST(scores) AS m (score)
如需將外部 Hive 中繼存放區連線到 Athena 的相關資訊,請參閱使用外部蜂巢元存儲。
考量與限制
當從 Athena 查詢 Hive 檢視時,請考慮下列幾點:
-
Athena 不支援建立 Hive 檢視。您可以在外部 Hive 中繼存放區中建立 Hive 檢視,然後您可以從 Athena 查詢該檢視。
-
Athena 不支援蜂巢檢視UDFs的自訂。
-
由於 Athena 主控台中存在已知問題,Hive 檢視顯示在資料表清單下,而不是檢視清單下。
-
雖然翻譯過程是自動的,但某些 Hive 函數在 Hive 檢視中不受支援或需要特殊處理。如需詳細資訊,請參閱下一節。
Hive 函數支援限制
本節重點介紹了 Athena 不支援 Hive 檢視或需要特殊處理的 Hive 函數。目前,由於 Athena 主要支援 Hive 2.2.0 中的函數,因此無法使用僅在更高版本 (如 Hive 4.0.0) 中可用的函數。有關 Hive 功能的完整列表,請參閱 Hive 語言手冊UDF
彙總函數
需要特殊處理的彙總函數
Hive 檢視的以下彙總函數需要特殊處理。
-
Avg – 使用
avg(CAST(i AS DOUBLE))
而不是avg(INT i)
。
不支援彙總函數
在 Athena 中,Hive 檢視不支援以下 Hive 彙總函數。
covar_pop histogram_numeric ntile percentile percentile_approx
在 Athena 中,Hive 檢視不支援迴歸函數,例如 regr_count
、regr_r2
和 regr_sxx
。
不支援日期函數
在 Athena 中,Hive 檢視不支援以下 Hive 日期函數。
date_format(date/timestamp/string ts, string fmt) day(string date) dayofmonth(date) extract(field FROM source) hour(string date) minute(string date) month(string date) quarter(date/timestamp/string) second(string date) weekofyear(string date) year(string date)
不支援遮罩函數
在 Athena 中,Hive 檢視不支援 Hive 遮罩函數,例如 mask()
和 mask_first_n()
。
其他函數
需要特殊處理的其他函數
Hive 檢視的以下其他函數需要特殊處理。
-
md5 – Athena 支援
md5(binary)
而非md5(varchar)
。 -
Explode – 在以下語法中使用時,Athena 支援
explode
:LATERAL VIEW [OUTER] EXPLODE(
<argument>
) -
Posexplode – 在以下語法中使用時,Athena 支援
posexplode
:LATERAL VIEW [OUTER] POSEXPLODE(
<argument>
)在
(pos, val)
輸出中,Athena 將pos
資料欄視為BIGINT
。因此,您可能需要將pos
資料欄轉換為BIGINT
,以避免檢視過時。以下範例說明此技術。SELECT CAST(c AS BIGINT) AS c_bigint, d FROM table LATERAL VIEW POSEXPLODE(
<argument>
) t AS c, d
不支援的其他函數
在 Athena 中,Hive 檢視不支援以下 Hive 函數。
aes_decrypt aes_encrypt current_database current_user inline java_method logged_in_user reflect sha/sha1/sha2 stack version
運算子
需要特殊處理的運算子
Hive 檢視的以下運算子需要特殊處理。
-
求餘運算子 (%) – 因為
DOUBLE
類型隱含地轉換為DECIMAL(x,y)
,以下語法可能會導致View is stale
(檢視過時) 錯誤訊息:a_double % 1.0 AS column
若要解決此問題,請使用
CAST
,如下列範例所示。CAST(a_double % 1.0 as DOUBLE) AS column
-
除法運算子 (/) – 在 Hive 中,
int
除以int
等於double
。在 Athena 中,相同的運算會產生一個遭截斷的int
。
不支援的運算子
Athena 不支援 Hive 檢視的以下運算子。
~A – 位元 NOT
A ^ b – 位元 XOR
A & b – 位元 AND
A | b – 位元 OR
A <=> b – 對於非 null 運算元,會傳回與等於 (=
) 運算子相同的結果。如果兩個皆為 NULL
,則會傳回 TRUE
;如果其中一個是 NULL
,則會傳回 FALSE
。
字串函數
需要特殊處理的字串函數
Hive 檢視的以下 Hive 字串函數需要特殊處理。
-
chr(bigint|double a) – Hive 允許負值引數;Athena 則不允許。
-
instr(string str, string substr) – 因為
instr
函數的 Athena 映射會傳回BIGINT
而不是INT
,請使用以下語法:CAST(instr(string str, string substr) as INT)
如果沒有這個步驟,檢視將被視為過時。
-
length(string a) – 因為
length
函數的 Athena 映射會傳回BIGINT
而不是INT
,請使用以下語法,以使檢視不會被視為過時:CAST(length(string str) as INT)
不支援字串函數
在 Athena 中,Hive 檢視不支援以下 Hive 字串函數。
ascii(string str) character_length(string str) decode(binary bin, string charset) encode(string src, string charset) elt(N int,str1 string,str2 string,str3 string,...) field(val T,val1 T,val2 T,val3 T,...) find_in_set(string str, string strList) initcap(string A) levenshtein(string A, string B) locate(string substr, string str[, int pos]) octet_length(string str) parse_url(string urlString, string partToExtract [, string keyToExtract]) printf(String format, Obj... args) quote(String text) regexp_extract(string subject, string pattern, int index) repeat(string str, int n) sentences(string str, string lang, string locale) soundex(string A) space(int n) str_to_map(text[, delimiter1, delimiter2]) substring_index(string A, string delim, int count)
XPath不支援的功能
在 Athena 中不支援 Hive 檢視的 Hive XPath 功能xpath_short
,例xpath
如、和xpath_int
。
故障診斷
當您在 Athena 中使用 Hive 檢視時,您可能會遇到以下問題:
-
檢視
<view name>
過時 — 此訊息通常表示 Hive 和 Athena 檢視之間的類型不相符。如果 Hive LanguageManual UDF和 Presto 函數和操作符文檔中的 相同函數具有不同的簽名,請嘗試轉換不匹配的數據類型。 -
未註冊函數 – Athena 目前不支援此函數。如需詳細資訊,請參閱本文件的前述資訊。