オブジェクト・ストアのデータファイルにアクセスする方法

著者 [Adam Tworkiewicz](adam.tworkiewicz@teradata.com)
最終更新日 2021年9月7日

:::note warn
警告
本記事はTeradata Corporationのサイト[Getting Started](https://quickstarts.teradata.com/index.html#getting-access-to-vantage)に掲載された内容を抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

# 概要
Native Object Storage (NOS) は、AWS S3、Google GCS、Azure Blob、オンプレミス実装などのオブジェクト・ストレージのファイルに保存されたデータを照会するための Vantage 機能です。データを Vantage に取り込むためのデータパイプラインを構築することなく、データを探索したい場合に便利です。

# 前提条件
Teradata Vantageインスタンスにアクセスする必要があります。NOS は、Vantage Express から Developer、DYI、Vantage as a Service まで、バージョン 17.10 以降のすべての Vantage エディションで有効になっています。

::: note info
Vantageの新しいインスタンスが必要な場合は、[Google Cloud](https://qiita.com/ykswi/items/10a382de5fa5a4a42c50)、[Azure](https://qiita.com/ykswi/items/2c30aa1f5413b16c838c)、[AWS](https://qiita.com/ykswi/items/fba559149ad568678d58)のクラウドにVantage Expressという無料版をデプロイメントすることができます。これらを利用する場合クラウド上のインフラ利用料が必要になりますが、このチュートリアルの実行にあたってはオブジェクト・ストレージからのデータ読み込みを行うためVantage Expressもクラウド上での利用をお奨めいたします。

:::

# NOSでデータを探索する

::: note info
現在、NOSはCSV、JSON（配列または改行で区切られたもの）、Parquetのデータ形式をサポートしています。
:::

S3バケットにCSVファイルとして保存されているデータセットがあるとします。Vantageに取り込むかどうかを決める前に、そのデータセットを調査したいと思います。このシナリオでは、米国地質調査所によって収集された河川流量データを含む公開データセットを使用することにします。またバケットは、Teradataが公開している[https://td-usgs-public.s3.amazonaws.com/](https://td-usgs-public.s3.amazonaws.com/)を使用します。

まずはサンプルCSVデータを見てみましょう。Vantageがバケットから取得する最初の10行を取り出します。

```sql:readS3.sql
SELECT
  TOP 10 *
FROM (
	LOCATION='/s3/td-usgs-public.s3.amazonaws.com/CSVDATA/'
) AS d;
```

クエリーの結果は次のようになります。

|GageHeight2|Flow|site_no|datetime|Precipitation|GageHeight|
|-----------:|-----:|--------:|:----------------|-------------:|-----------:|
|10.9|15300|09380000|2018-06-28 00:30|671|9.80|
|10.8|14500|09380000|2018-06-28 01:00|673|9.64|
|10.7|14100|09380000|2018-06-28 01:15|672|9.56|
|11.0|16200|09380000|2018-06-27 00:00|669|9.97|
|10.9|15700|09380000|2018-06-27 00:30|668|9.88|
|10.8|15400|09380000|2018-06-27 00:45|672|9.82|
|10.8|15100|09380000|2018-06-27 01:00|672|9.77|
|10.8|14700|09380000|2018-06-27 01:15|672|9.68|
|10.9|16000|09380000|2018-06-27 00:15|668|9.93|
|10.8|14900|09380000|2018-06-28 00:45|672|9.72|

たくさんの数字がありますが、これらは何を意味するのでしょうか。この質問に答えるために、VantageにCSVファイルのスキーマを検出するように依頼します。

```sql:rewadS3withRT.sql
SELECT
  *
FROM (
	LOCATION='/s3/td-usgs-public.s3.amazonaws.com/CSVDATA/'
	RETURNTYPE='NOSREAD_SCHEMA'
) AS d;
```

Vantageは、スキーマを分析するためのデータサンプルをフェッチして結果を返します。

|Name|Datatype|FileType|Location|
|:---------------|:-----------------------------------|:---------|:-------------------------------------------------------------------|
|GageHeight2|decimal(3,2)|csv|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09513780/2018/06/27.csv|
|Flow|decimal(3,2)|csv|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09513780/2018/06/27.csv|
|site_no|int|csv|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09513780/2018/06/27.csv|
|datetime|TIMESTAMP(0) FORMAT'Y4-MM-DDBHH:MI'|csv|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09513780/2018/06/27.csv|
|Precipitation|decimal(3,2)|csv|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09513780/2018/06/27.csv|
|GageHeight|decimal(3,2)|csv|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09513780/2018/06/27.csv|

各カラムについて、名前、データ型、スキーマを推測するために使用されたファイル名をが表示されています。CSVファイルには6つのカラムがあることがわかります。

# NOSでデータを照会する
スキーマがわかったので、データセットを通常のSQLテーブルのように扱うことができ。そのことを証明するために、データの集計をやってみましょう。気温を収集しているサイトについて、サイトごとの平均気温を取得してみましょう。

```sql:rewadS3withQry.sql
SELECT
  site_no Site_no, AVG(Flow) Avg_Flow
FROM (
  LOCATION='/s3/td-usgs-public.s3.amazonaws.com/CSVDATA/'
) AS d
GROUP BY
  site_no
HAVING
  Avg_Flow IS NOT NULL;
```

結果は以下のようになります。

|Site_no|Avg_Flow|
|--------:|---------:|
|09380000|11|
|09423560|73|
|09424900|93|
|09429070|81|

今後クエリーを実行しやすくするために、このオブジェクトを恒久的なソースとして扱うことができる外部テーブルとして登録します。

```sql:CreateForeignTBL.sql
-- If you are running this sample as dbc user you will not have permissions
-- to create a table in dbc database. Instead, create a new database and use
-- the newly create database to create a foreign table.

CREATE DATABASE Riverflow
  AS PERMANENT = 60e6, -- 60MB
  SPOOL = 120e6; -- 120MB

-- change current database to Riverflow
DATABASE Riverflow;

CREATE FOREIGN TABLE riverflow
  USING ( LOCATION('/s3/td-usgs-public.s3.amazonaws.com/CSVDATA/') );

SELECT top 10 * FROM riverflow;
```
最後のSELECT文により以下のような結果が返ります。

|Location|GageHeight2|Flow|site_no|datetime|Precipitation|GageHeight|
|:-------------------------------------------------------------------|:-----------|:----|-------:|:-------------------|-------------:|:----------|
|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09429070/2018/07/02.csv|null|null|9429070|2018-07-02 14:40:00|1.21|null|
|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09400815/2018/07/10.csv|null|0.00|9400815|2018-07-10 00:30:00|0.00|-0.01|
|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09400815/2018/07/10.csv|null|0.00|9400815|2018-07-10 00:45:00|0.00|-0.01|
|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09400815/2018/07/10.csv|null|0.00|9400815|2018-07-10 01:00:00|0.00|-0.01|
|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09400815/2018/07/10.csv|null|0.00|9400815|2018-07-10 00:15:00|0.00|-0.01|
|/S3/s3.amazonaws.com/td-usgs-public/CSVDATA/09429070/2018/07/02.csv|null|null|9429070|2018-07-02 14:38:00|1.06|null|

今回の SELECT文は、データベース内のテーブルに対する通常のSELECTと同じように見えます。データを照会する際に秒単位の応答時間が必要な場合、CSVデータをVantageに取り込んで高速化する簡単な方法があります。その方法については、こちらをご覧ください。

# NOSからVantageにデータをロードする
オブジェクト・ストレージへのクエリーはVantageのデータベーステーブルへのクエリーよりも時間がかかります。もし、そのデータに利用価値がありそうで、もっと早く答えが出るようなソリューションで分析したいと思ったらどうでしょうか？
NOSで返されたデータは、CREATE TABLE文のソースとして使用することができますのでクエリーの結果を簡単にVantageのデータベーステーブルにすることができます。

::: note warn
このクエリは、前のステップでデータベースRiverflowとriverflowという外部テーブルを作成したと仮定しています。
:::

```sql:CreateTBLSelfromNOS.sql
-- This query assumes you created database `Riverflow`
-- and a foreign table called `riverflow` in the previous step.

CREATE MULTISET TABLE riverflow_native (site_no, Flow, GageHeight, datetime)
AS (
  SELECT site_no, Flow, GageHeight, datetime FROM riverflow
) WITH DATA
NO PRIMARY INDEX;

SELECT TOP 10 * FROM riverflow_native;
```

最後のSELECT文の結果は下記のようになります。

|site_no|Flow|GageHeight|datetime|
|-------:|-----:|----------:|:-------------------|
|9400815|.00|-.01|  2018-07-10 00:30:00|
|9400815|.00|-.01|  2018-07-10 01:00:00|
|9400815|.00|-.01|  2018-07-10 01:15:00|
|9400815|.00|-.01|  2018-07-10 01:30:00|
|9400815|.00|-.01|  2018-07-10 02:00:00|
|9400815|.00|-.01|  2018-07-10 02:15:00|
|9400815|.00|-.01|  2018-07-10 01:45:00|
|9400815|.00|-.01|  2018-07-10 00:45:00|
|9400815|.00|-.01|  2018-07-10 00:15:00|
|9400815|.00|-.01|  2018-07-10 00:00:00|

今回のSELECT文は1秒以内に返されました。VantageはNOSからデータを取得する必要がなかったからです。Vantageは、NOSからデータを取得する必要がなく、すでにデータベースにあるデータを使って回答したのです。

# プライベートバケットにアクセス
ここまでは、パブリックバケットを使用しました。プライベートバケットを使用している場合はどうでしょうか？Vantage が使用する認証情報はどのように伝えればよいのでしょうか？
バケットにアクセスするための認証情報はクエリに直接記入することが可能です。

```sql:AccesstoPrivateBkt
SELECT
  TOP 10 *
FROM (
  LOCATION='/s3/td-usgs-public.s3.amazonaws.com/CSVDATA/'
  AUTHORIZATION='{"ACCESS_ID":"","ACCESS_KEY":""}'
) AS d;
```

これらの認証情報を常に入力することは、面倒であり、安全性が低くなる可能性があります。Vantageでは、認証情報を格納するコンテナとして機能する認証オブジェクトを作成することができます。

```sql:Authorize.sql
CREATE AUTHORIZATION aws_authorization
  USER 'YOUR-ACCESS-KEY-ID'
  PASSWORD 'YOUR-SECRET-ACCESS-KEY';
```

そして、外部テーブルを作成する際に、認可オブジェクトを参照するようにすることができます。

```sql:CreateForeignTBLwithAuthorize.sql
CREATE FOREIGN TABLE riverflow
, EXTERNAL SECURITY aws_authorization
USING ( LOCATION('/s3/td-usgs-public.s3.amazonaws.com/CSVDATA/') );
```

# Vantageからオブジェクト・ストレージへのデータエクスポート
これまで、オブジェクト・ストレージからのデータの読み取りとインポートについて説明してきました。SQLを使用してVantageからオブジェクト・ストレージにデータをエクスポートする方法があればいいと思いませんか？
これこそが、WRITE_NOS関数の目的です。例えば、riverflow_nativeテーブルからオブジェクト・ストレージにデータをエクスポートすることは以下のようなクエリーで可能です。

```sql:WritetoNOS.sql
SELECT * FROM WRITE_NOS (
  ON ( SELECT * FROM riverflow_native )
  PARTITION BY site_no ORDER BY site_no
  USING
    LOCATION('YOUR-OBJECT-STORE-URI')
    AUTHORIZATION(aws_authorization)
    STOREDAS('PARQUET')
    COMPRESSION('SNAPPY')
    NAMING('RANGE')
    INCLUDE_ORDERING('TRUE')
) AS d;
```

ここではriverflow_nativeからデータを取得しパーケット形式を使用してYOUR-OBJECT-STORE-URIバケットに保存します。データはsite_no属性でファイルに分割され圧縮されます。

# まとめ
このクイックスタートでは、VantageのNative Object Storage (NOS) 機能を使用して、オブジェクト・ストレージからデータを読み取る方法について説明しました。NOSは、CSV、JSON、Parquet形式で保存されたデータの読み取りとインポートをサポートしています。
また、NOSはVantageからオブジェクト・ストレージにデータをエクスポートすることもできます。

# さらに詳しく
・[Teradata Vantage™ - Native Object Store Getting Started Guide](https://docs.teradata.com/r/2mw8ooFr~xX0EaaGFaDW8A/root)

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)