使用 Hive 视图
您可以使用 Athena 查询外部 Apache Hive 元存储中的现有视图。Athena 会在运行时实时转换视图,无需更改原始视图或存储翻译。
例如,假设您的 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 的信息,请参阅 使用外部 Hive 元存储。
注意事项和限制
在从 Athena 查询 Hive 视图时,请考虑以下几点:
-
Athena 不支持创建 Hive 视图。您可以在外部 Hive 元存储中创建 Hive 视图,之后可以从 Athena 查询该视图。
-
Athena Hive 视图不支持自定义 UDF。
-
由于 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 视图不支持 mask()
和 mask_first_n()
等 Hive 掩码函数。
其他函数
需要特殊处理的其他函数
Hive 视图的以下其他函数需要特殊处理。
-
md5 – Athena 支持
md5(binary)
,但不支持md5(varchar)
。 -
Explode – 在以下语法中使用时,Athena 支持
explode
:LATERAL VIEW [OUTER] EXPLODE(
<argument>
) -
Posplode:在以下语法中使用时,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 视图的以下运算符需要特殊处理。
-
Mod 运算符 (%):因为
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
,则返回 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 视图不支持 xpath
、xpath_short
和 xpath_int
等 Hive XPath 函数。
故障排除
在 Athena 中使用 Hive 视图时,可能遇到以下问题:
-
视图
<view name>
已过时 – 此消息通常表示 Hive 视图与 Athena 视图存在类型不匹配问题。如果 Hive LanguageManual UDF以及 Presto 函数和运算符 文档中的相同函数具有不同签名,请尝试强制转换不匹配的数据类型。 -
函数未注册:Athena 目前不支持此函数。有关更多信息,请参阅本文档前面所述的信息。