

# 使用 Hive 视图
<a name="hive-views"></a>

您可以使用 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 元存储](connect-to-data-source-hive.md)。

## 注意事项和限制
<a name="hive-views-considerations-and-limitations"></a>

在从 Athena 查询 Hive 视图时，请考虑以下几点：
+ Athena 不支持创建 Hive 视图。您可以在外部 Hive 元存储中创建 Hive 视图，之后可以从 Athena 查询该视图。
+ Athena Hive 视图不支持自定义 UDF。
+ 由于 Athena 控制台中的已知问题，Hive 视图显示在表列表下而不是视图列表下。
+ 尽管转换过程会自动执行，但 Hive 视图不支持某些 Hive 函数或需要特殊处理。有关更多信息，请参阅下文。

## Hive 函数支持限制
<a name="hive-views-function-limitations"></a>

此部分重点介绍了 Athena Hive 视图不支持的或需要特殊处理的 Hive 函数。目前，Athena 主要支持 Hive 2.2.0 的函数，因此不支持只在更高版本（例如 Hive 4.0.0）中可用的函数。有关 Hive 函数的完整列表，请参阅 [Hive 语言手册 UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf)。

### 聚合函数
<a name="hive-views-aggregate-functions"></a>

#### 需要特殊处理的聚合函数
<a name="hive-views-aggregate-functions-special-handling"></a>

以下 Hive 视图的聚合函数需要特殊处理。
+ **Avg** – 请使用 `avg(CAST(i AS DOUBLE))`，而非 `avg(INT i)`。

#### 不支持的聚合函数
<a name="hive-views-aggregate-functions-not-supported"></a>

Athena 的 Hive 视图不支持以下 Hive 聚合函数。

```
covar_pop
histogram_numeric
ntile
percentile
percentile_approx
```

Athena 的 Hive 视图不支持 `regr_count`、`regr_r2` 和 `regr_sxx` 等回归函数。

### 不支持的日期函数
<a name="hive-views-date-functions-not-supported"></a>

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)
```

### 不支持的掩码函数
<a name="hive-views-masking-functions-not-supported"></a>

Athena 的 Hive 视图不支持 `mask()` 和 `mask_first_n()` 等 Hive 掩码函数。

### 其他函数
<a name="hive-views-miscellaneous-functions"></a>

#### 需要特殊处理的其他函数
<a name="hive-views-supported-miscellaneous-functions-special-handling"></a>

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
  ```

#### 不支持的其他函数
<a name="hive-views-unsupported-miscellaneous-functions-not-supported"></a>

Athena 的 Hive 视图不支持以下 Hive 函数。

```
aes_decrypt
aes_encrypt
current_database
current_user
inline
java_method
logged_in_user
reflect
sha/sha1/sha2
stack
version
```

### 运算符
<a name="hive-views-operators"></a>

#### 需要特殊处理的运算符
<a name="hive-views-operators-special-handling"></a>

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`。

#### 不支持的运算符
<a name="hive-views-operators-not-supported"></a>

Athena 的 Hive 视图不支持以下运算符。

**\~A** – 按位 `NOT`

**A ^ b** – 按位 `XOR`

**A & b** – 按位 `AND`

**A \| b** – 按位 `OR`

**A <=> b** – 返回与非空操作数的等于 (`=`) 运算符相同的结果。如果两者都为 `NULL`，则返回 `TRUE`；如果其中一个为 `NULL`，则返回 `FALSE`。

### 字符串函数
<a name="hive-views-string-functions"></a>

#### 需要特殊处理的字符串函数
<a name="hive-views-string-functions-special-handling"></a>

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)
  ```

#### 不支持的字符串函数
<a name="hive-views-string-functions-not-supported"></a>

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 函数
<a name="hive-views-xpath-functions-not-supported"></a>

Athena 的 Hive 视图不支持 `xpath`、`xpath_short` 和 `xpath_int` 等 Hive XPath 函数。

## 问题排查
<a name="hive-views-troubleshooting"></a>

在 Athena 中使用 Hive 视图时，可能遇到以下问题：
+ **视图 {{<view name>}} 已过时** – 此消息通常表示 Hive 视图与 Athena 视图存在类型不匹配问题。如果 [Hive LanguageManual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf) 以及 [Presto 函数和运算符](https://prestodb.io/docs/current/functions.html)文档中的相同函数具有不同签名，请尝试强制转换不匹配的数据类型。
+ **函数未注册**：Athena 目前不支持此函数。有关更多信息，请参阅本文档前面所述的信息。