

# 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)」(Athena データコネクタを外部の Hive メタストアに使用する) を参照してください。

## 考慮事項と制限事項
<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 関数、および特別な処理が必要な Hive 関数について取り上げます。現在、Athena は主に Hive 2.2.0 の関数をサポートしているため、上位バージョン (Hive 4.0.0 など) でのみ有効な関数を使用することはできません。Hive 関数の全リストについては、Hive の「[LanguageManual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf)」(言語マニュアル UDF) を参照してください。

### 集計関数
<a name="hive-views-aggregate-functions"></a>

#### 特別な処理を必要とする集計関数
<a name="hive-views-aggregate-functions-special-handling"></a>

Hive ビューの次の集計関数では、特別な処理が必要です。
+ **平均** — `avg(INT i)` の代わりに `avg(CAST(i AS DOUBLE))` を使用します。

#### サポートされていない集計関数
<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>)
  ```
+ **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>

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 ビューでは、次の演算子はサポートされていません。

**\$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>

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 *<view name>* is stale** (ビュー <ビュー名> が古くなっています) – このメッセージは通常、Hive と Athena のビューで型の不一致が存在することを示します。Hive の「[LanguageManual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf)」(言語マニュアル UDF) ドキュメントと Presto の「[Functions and Operators](https://prestodb.io/docs/current/functions.html)」(関数と演算子) ドキュメントの同じ関数が異なるシグネチャを持つ場合は、不一致のデータ型をキャストしてみてください。
+ **Function not registered** (関数が登録されていません) – 現在、Athena では、この関数をサポートしていません。詳細については、このドキュメントの前述の情報を参照してください。