使用 Hive 视图 - Amazon Athena

使用 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 的信息,请参阅 将 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_countregr_r2regr_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 视图不支持 xpathxpath_shortxpath_int 等 Hive XPath 函数。

故障排除

在 Athena 中使用 Hive 视图时,可能遇到以下问题:

  • 视图 <view name> 已过时 – 此消息通常表示 Hive 视图与 Athena 视图存在类型不匹配问题。如果 Hive LanguageManual UDF 以及 Presto 函数和运算符文档中的相同函数具有不同签名,请尝试强制转换不匹配的数据类型。

  • 函数未注册:Athena 目前不支持此函数。有关更多信息,请参阅本文档前面所述的信息。