VantageからのオブジェクトストアへのParquetファイルの作成

著者 [Obed Vega](obed.vega@teradata.com)
最終更新日 2022年8月2日

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

# 概要
Native Object Storage (NOS) はCSV、JSON、Parquet形式のデータセットなどのファイルに保存されているデータを照会するためのVantage 機能です。これらはAWS S3、Google GCS、Azure BlobやオンプレミスのS3互換のオブジェクト・ストレージをサポートしています。この機能はVantageにデータを取り込むためのデータパイプラインを構築せずにデータを探索したい場合に便利ですが、このチュートリアルでは逆にVantageからオブジェクト・ストレージにParquetファイル形式でデータをエクスポートする方法について説明します。

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

::: note info
このチュートリアルは、s3 awsオブジェクト・ストレージをベースにしています。チュートリアルを完了するには、書き込み権限を持つあなた自身のs3バケットが必要です。

Vantageの新しいインスタンスが必要な場合は[AWS](https://qiita.com/ykswi/items/fba559149ad568678d58)のクラウドに無料のVantage Expressをデプロイメントすることができます。
:::

# WRITE_NOS関数でParquetファイルを作成する
**WRITE_NOS**を使用するとデータベーステーブルまたはクエリーの結果を選択したまたはすべてのカラムを使用してAmazon S3, Azure Blob storage, Azure Data Lake Storage Gen2, Google Cloud Storageなどの外部オブジェクト・ストレージに書き込むことができます。この機能ではデータをParquet形式で保存します。

**WRITE_NOS**機能については、[NOSのドキュメント](https://docs.teradata.com/r/Teradata-VantageTM-Native-Object-Store-Getting-Started-Guide/June-2022/Writing-Data-to-External-Object-Store)に詳細なドキュメントが掲載されていますので参考にしてください。

**WRITE_NOS**関数を実行できるデータベースへのアクセス権が必要です。そのようなデータベースがない場合は、以下のSQLでVantageユーザーを作成します。

```sql:CreateUser.sql
CREATE USER db AS PERM=10e7, PASSWORD=db;

-- 必要な権限の付与を忘れずに行ってください
GRANT EXECUTE FUNCTION on TD_SYSFNLIB.READ_NOS to db;
GRANT EXECUTE FUNCTION on TD_SYSFNLIB.WRITE_NOS to db;
```

::: note info
ユーザーとその権限の設定についてもっと詳しく知りたい場合は、[NOSのドキュメント](https://docs.teradata.com/r/Teradata-VantageTM-Native-Object-Store-Getting-Started-Guide/June-2022/Setting-Up-Access/Setting-Access-Privileges)もチェックしてください。
:::

①	まずVantageインスタンスにテーブルを作成しましょう。
```sql:CreateTable.sql
CREATE SET TABLE db.parquet_table ,FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO,
     MAP = TD_MAP1
     (
      column1 SMALLINT NOT NULL,
      column2 DATE FORMAT 'YY/MM/DD' NOT NULL,
      column3 DECIMAL(10,2))
PRIMARY INDEX ( column1 );
```

②	テーブルにサンプルのデータを入力します。

```sql:Insert.sql
INSERT INTO db.parquet_table (1,'2022/01/01',1.1);
INSERT INTO db.parquet_table (2,'2022/01/02',2.2);
INSERT INTO db.parquet_table (3,'2022/01/03',3.3);
```

これでテーブルの内容は以下のようになりました。

|column1|column2|column3|
|-------:|:--------|------------:|
|1|22/01/01|1.10|
|2|22/01/02|2.20|
|3|22/01/03|3.30|

③　**WRITE_NOS**でPaequetファイルを作成します。「BUCKET_NAME」は使用するs3バケットの名前に置き換えてください。また、「YOUR-ACCESS-KEY-ID」と「YOUR-SECRET-ACCESS-KEY」はあなたのアクセスキーとシークレットに置き換えてください。

```sql:RunWriteNOS.sql
SELECT * FROM WRITE_NOS (
ON ( SELECT * FROM db.parquet_table)
USING
LOCATION('/s3/<BUCKET_NAME>.s3.amazonaws.com/parquet_file_on_NOS.parquet')
AUTHORIZATION('{"ACCESS_ID":"<YOUR-ACCESS-KEY-ID>",
"ACCESS_KEY":"<YOUR-SECRET-ACCESS-KEY>"}')
STOREDAS('PARQUET')
MAXOBJECTSIZE('16MB')
COMPRESSION('SNAPPY')
INCLUDE_ORDERING('TRUE')
INCLUDE_HASHBY('TRUE')
) as d;
```

::: note info
オブジェクト・ストレージにアクセスするための認証情報を作成する方法については、クラウドプロバイダーのドキュメントを確認してください。例えばAWSの場合、[How do I create an AWS access key?](https://aws.amazon.com/premiumsupport/knowledge-center/create-access-key/)になります。
:::

これでオブジェクト・ストレージのバケットにParquetファイルが作成されました。ここでファイルの内容を簡単に参照するために以下の手順を実行してみましょう。

④	作成したParquetファイルからデータを参照する外部テーブルを作成します。先ほどと同様に「BUCKET_NAME」をs3バケットの名前に置き換えるのを忘れないでください。また「YOUR-ACCESS-KEY-ID」と「YOUR-SECRET-ACCESS-KEY」も同様です。

```sql:CreateForeignTable.sql
CREATE MULTISET FOREIGN TABLE db.parquet_table_to_read_file_on_NOS
, EXTERNAL SECURITY DEFINER TRUSTED CEPH_AUTH,
MAP = TD_MAP1
(
  Location VARCHAR(2048) CHARACTER SET UNICODE CASESPECIFIC
  , col1 SMALLINT
  , col2 DATE
  , col3 DECIMAL(10,2)

)
USING (
    LOCATION ('/s3/<BUCKET_NAME>.s3.amazonaws.com/parquet_file_on_NOS.parquet')
    AUTHORIZATION('{"ACCESS_ID":"<YOUR-ACCESS-KEY-ID>",
    "ACCESS_KEY":"<YOUR-SECRET-ACCESS-KEY>"}')
    STOREDAS ('PARQUET')
)NO PRIMARY INDEX;
```

⑤	これで作成したparquetファイルのデータを参照する準備が整いました。

```sql:SelectFromParquet.sql
SELECT col1, col2, col3 FROM db.parquet_table_to_read_file_on_NOS;
```

クエリから返される返される結果は次のようなもののはずです。

|col1|col2|col3|
|------:|:--------|------------:|
|1|22/01/01|1.10|
|2|22/01/02|2.20|
|3|22/01/03|3.30|

（日本語訳注）
Parquetファイルを書き出しすために使用したテーブルと同じ内容であることがわかります。

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

# さらに詳しく
・[Teradata Vantage™ - Writing Data to External Object Store](https://docs.teradata.com/r/Teradata-VantageTM-Native-Object-Store-Getting-Started-Guide/June-2022/Writing-Data-to-External-Object-Store)

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