

# Hive 뷰 작업
<a name="hive-views"></a>

Athena를 사용하여 외부 Apache Hive 메타스토어의 기존 뷰를 쿼리할 수 있습니다. Athena는 원본 뷰를 변경하거나 변환을 저장하지 않고 런타임에서 즉석으로 뷰를 변환합니다.

예를 들어 다음과 같이 Athena에서 지원되지 않는 구문(`LATERAL VIEW explode()` 등)을 사용하는 Hive 뷰가 있다고 가정합니다.

```
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(INT i)` 대신 `avg(CAST(i AS DOUBLE))`을 사용하세요.

#### 지원되지 않는 집계 함수
<a name="hive-views-aggregate-functions-not-supported"></a>

다음 Hive 집계 함수는 Athena에서 Hive 뷰에 대해 지원되지 않습니다.

```
covar_pop
histogram_numeric
ntile
percentile
percentile_approx
```

`regr_count`, `regr_r2`, `regr_sxx`와 같은 회귀 함수는 Athena에서 Hive 뷰에 대해 지원되지 않습니다.

### 지원되지 않는 날짜 함수
<a name="hive-views-date-functions-not-supported"></a>

다음 Hive 날짜 함수는 Athena에서 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>

`mask()`, `mask_first_n()`와 같은 Hive 마스킹 함수는 Athena에서 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>)
  ```
+ **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
  ```

#### 지원되지 않는 기타 함수
<a name="hive-views-unsupported-miscellaneous-functions-not-supported"></a>

다음 Hive 함수는 Athena에서 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 뷰에 대해 지원하지 않습니다.

**\$1A** – 비트 `NOT`

**A ^ b** – 비트 `XOR`

**A & b** – 비트 `AND`

**A \$1 b** – 비트 `OR`

**A <=> b** – null이 아닌 피연산자에 대해 같음(`=`) 연산자와 동일한 결과를 반환합니다. 둘 다 `NULL`인 경우 `TRUE`를, 둘 중 하나가 `NULL`인 경우 `FALSE`를 반환합니다.

### 문자열 함수
<a name="hive-views-string-functions"></a>

#### 특별한 처리가 필요한 문자열 함수
<a name="hive-views-string-functions-special-handling"></a>

Hive 뷰에 대한 다음 Hive 문자열 함수는 특별한 처리가 필요합니다.
+ **chr(bigint\$1double a)** – Hive는 음수 인수를 허용하지만 Athena는 그렇지 않습니다.
+ **instr(string str, string substr)** – `instr` 함수에 대한 Athena 매핑이 `INT` 대신 `BIGINT`를 반환하므로 다음 구문을 사용하세요.

  ```
  CAST(instr(string str, string substr) as INT)         
  ```

  이 단계가 없으면 뷰가 오래된 것으로 간주됩니다.
+ **length(string a)** – `length` 함수에 대한 Athena 매핑이 `INT` 대신 `BIGINT`를 반환하므로 뷰가 오래된 것으로 간주되지 않도록 다음 구문을 사용하세요.

  ```
  CAST(length(string str) as INT)
  ```

#### 지원되지 않는 문자열 함수
<a name="hive-views-string-functions-not-supported"></a>

다음 Hive 문자열 함수는 Athena에서 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>

`xpath`, `xpath_short`, `xpath_int`와 같은 Hive XPath 함수는 Athena에서 Hive 뷰에 대해 지원되지 않습니다.

## 문제 해결
<a name="hive-views-troubleshooting"></a>

Athena에서 Hive 뷰를 사용할 때 다음과 같은 문제가 발생할 수 있습니다.
+ **View *<view name>* is stale** – 이 메시지는 일반적으로 Hive와 Athena 뷰 간의 형식 불일치를 나타냅니다. [Hive LanguageManual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf)와 [Presto functions and operators](https://prestodb.io/docs/current/functions.html)(Presto 함수 및 연산자) 설명서에서 동일한 함수가 서로 다른 특징을 갖는 경우 일치하지 않는 데이터 형식을 캐스팅해 보세요.
+ **Function not registered** – Athena가 현재 함수를 지원하지 않습니다. 자세한 내용은 이 문서 앞부분의 정보를 참조하십시오.