使用 Hive 视图 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 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 目前不支持此函数。有关更多信息,请参阅本文档前面所述的信息。