Imagen

オブジェクトストレージに保存されたクエリーデータ

概要

Native Object Storage (NOS) は、AWS S3、Google GCS、Azure Blob、またはオンプレミス実装などのオブジェクト ストレージ内のファイルに保存されているデータをクエリできるようにする Vantage の機能です。これは、Vantage にデータを取り込むためのデータ パイプラインを構築せずにデータを探索するシナリオに役立ちます。

前提条件

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

Vantage のテスト インスタンスが必要な場合は、 https://clearscape.teradata.com. で無料でプロビジョニングできます。

NOS でデータを探索する

現在、NOS は CSV、JSON (配列または改行区切りとして)、および Parquet データ形式をサポートしています。

データセットが CSV ファイルとして S3 バケットに保存されているとします。データセットを Vantage に取り込むかどうかを決定する前に、データセットを探索したいと考えています。このシナリオでは、the U.S. Geological Surveyによって収集された河川流量データを含む、Teradataによって公開された公開データセットを使用します。バケットは https://td-usgs-public.s3.amazonaws.com/ にあります。

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

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

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

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

アドホック探索アクティビティを永続ソースとして登録するには、それを外部テーブルとして作成します。

-- 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;

結果:

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 ステートメントは、データベース内のテーブルに対する通常の選択のように見えます。データのクエリー時に 1 秒未満の応答時間が必要な場合は、CSV データを Vantage に取り込んで処理を高速化する簡単な方法があります。その方法については、読み続けてください。

NOS から Vantage にデータをロードする

オブジェクト ストレージのクエリーには時間がかかります。データが興味深いと判断し、より迅速に答えが得られるソリューションを使用してさらに分析を行いたい場合はどうすればよいでしょうか? 良いニュースは、NOS で返されたデータを CREATE TABLE 文のソースとして使用できることです。CREATE TABLE 権限があると仮定すると、次を実行できます。

このクエリは、前の手順でデータベース 河川流量河川流量 という外部テーブルを作成したことを前提としています。
-- 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;

結果:

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 にどのように指示しますか?

資格情報をクエリーに直接インライン化することができます。

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

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

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

これにより、外部テーブルを作成するときに認可オブジェクトを参照できるようになります。

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 テーブルからオブジェクト ストレージにデータをエクスポートする場合を考えてみましょう。以下のクエリーを使用してこれを行うことができます。

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 からデータを取得し、parquet 形式を使用して YOUR-OBJECT-STORE-URI バケットに保存するように Vantage に指示します。データは site_no 属性によってファイルに分割されます。ファイルは圧縮されます。

まとめ

このクイック スタートでは、Vantage のネイティブ オブジェクト ストレージ (NOS) 機能を使用してオブジェクト ストレージからデータを読み取る方法を学習しました。NOS は、CSV、JSON、および Parquet 形式で保存されたデータの読み取りとインポートをサポートしています。NOS は、Vantage からオブジェクト ストレージにデータをエクスポートすることもできます。

このページは役に立ちましたか?