LoginSignup
7
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-09-21

著者 Adam Tworkiewicz
最終更新日 2021年9月7日

警告
本記事はTeradata CorporationのサイトGetting Startedに掲載された内容を抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。

概要

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 エディションで有効になっています。

Vantageの新しいインスタンスが必要な場合は、Google CloudAzureAWSのクラウドにVantage Expressという無料版をデプロイメントすることができます。これらを利用する場合クラウド上のインフラ利用料が必要になりますが、このチュートリアルの実行にあたってはオブジェクト・ストレージからのデータ読み込みを行うためVantage Expressもクラウド上での利用をお奨めいたします。

NOSでデータを探索する

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

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

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

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ファイルのスキーマを検出するように依頼します。

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テーブルのように扱うことができ。そのことを証明するために、データの集計をやってみましょう。気温を収集しているサイトについて、サイトごとの平均気温を取得してみましょう。

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

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

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のデータベーステーブルにすることができます。

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

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 が使用する認証情報はどのように伝えればよいのでしょうか?
バケットにアクセスするための認証情報はクエリに直接記入することが可能です。

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

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

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

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

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テーブルからオブジェクト・ストレージにデータをエクスポートすることは以下のようなクエリーで可能です。

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

Teradata Vantageへのお問合せ

Teradata Vantage へのお問合せ

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3