17.10 - 例: JSONデータの読み取り - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - Native Object Store 入門ガイド

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1214-171K-JPN
Language
日本語 (日本)

次の例は、TeradataのパブリックAzure Blobストレージ コンテナからJSON形式のデータにアクセスする方法を示しています。

次の表は、JSONデータを格納するTeradata提供のパブリック外部オブジェクト ストアに対するLOCATION値を示しています。例を実行するための設定で関数マッピングを設定した後で、これらの場所のいずれかを使用して例を実行できます。

プラットフォーム 場所
Amazon S3 /s3/td-usgs-public.s3.amazonaws.com/JSONDATA/
Azure BLOBストレージ /az/akiaxox5jikeotfww4ul.blob.core.windows.net/td-usgs/JSONDATA/
Google Cloud Storage /gs/storage.googleapis.com/td-usgs/JSONDATA/

独自の外部オブジェクト ストアを使用する場合は、例の変数置換を参照してLOCATION、ACCESS_ID/USER、およびACCESS_KEY/PASSWORDの例を確認します。

SHOW AUTHORIZATIONの使用

SHOW AUTHORIZATION NOS_USR.MyAuthObj;

許可オブジェクトが存在しない場合は、例を実行するための設定のステップを実行します。

指定したLOCATIONのペイロードを返すためのNOSREAD_RECORDの使用

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

<指定したLOCATIONのペイロードを返すためのNOSREAD_RECORDの使用>を参照してください。

JSONの例を実行するための設定

CREATE FOREIGN TABLE riverflow_json
, EXTERNAL SECURITY MyAuthObj
USING ( LOCATION('/s3/td-usgs-public.s3.amazonaws.com/JSONDATA/') );

<JSONの例を実行するための設定>を参照してください。

READ_NOSを使用した所定の位置にある外部データのサンプリング

SELECT TOP 2 * FROM READ_NOS_FM (
USING
LOCATION('/s3/td-usgs-public.s3.amazonaws.com/JSONDATA/')
RETURNTYPE('NOSREAD_RECORD')
) AS D;

<READ_NOSを使用した所定の位置にある外部データのサンプリング>を参照してください。

外部テーブルを使用した所定の位置にある外部データのサンプリング

SELECT TOP 2 payload.* FROM riverflow_json;

<外部テーブルを使用した所定の位置にある外部データのサンプリング>を参照してください。

JSON_KEYSを使用したヘッダー名の表示

SELECT DISTINCT * FROM JSON_KEYS (
ON (SELECT payload FROM riverflow_json)
) AS jsonKeys;

<JSON_KEYSを使用したキー名の表示>を参照してください。

最大値と最小値の検索

SELECT MAX(CAST(payload.Flow AS FLOAT) ( FORMAT '-ZZZZ9.99'))
, MIN(CAST(payload.Flow AS FLOAT) ( FORMAT '-(5)ZZZ9.99'))
FROM riverflow_json;

<最大値と最小値の検索>を参照してください。

特定の行セットのクエリー

SELECT MAX(CAST(payload.Flow AS FLOAT) ( FORMAT '-ZZZZ9.99'))
FROM riverflow_json
WHERE payload.site_no = '09394500';

<特定の行セットのクエリー>を参照してください。

CREATE TABLE AS … WITH DATAを使用したデータベースへの外部データのロード

CREATE MULTISET TABLE riverflowprecip_json(site_no,flow,gageheight,datetime) AS (
SELECT payload.site_no, payload.Flow, payload.GageHeight, payload.datetime
FROM riverflow_json
WHERE payload.Precipitation > 0
) WITH DATA
NO PRIMARY INDEX;

テーブル内の行数を表示します。

SELECT COUNT(*) FROM riverflowprecip_json;

<CREATE TABLE AS ... WITH DATAを使用したデータベースへの外部データのロード>を参照してください。

READ_NOSおよびCREATE TABLE ASを使用したデータベースへの外部データのロード

CREATE MULTISET TABLE riverflowperm_json(site_no,flow,gageheight,datetime) AS (
SELECT payload.site_no, payload.Flow, payload.GageHeight, payload.datetime
FROM ( LOCATION='/s3/td-usgs-public.s3.amazonaws.com/JSONDATA/' ) AS d
) WITH DATA;

テーブル内の行数を表示します。

SELECT COUNT (*) FROM riverflowperm_json;

<READ_NOSおよびCREATE TABLE ASを使用したデータベースへの外部データのロード>を参照してください。

INSERT ... SELECTを使用したデータベースへの外部データのロード

CREATE TABLE RiverFlowPermInsert_json (
DateTS CHAR(20)
,SiteNo CHAR(8)
,Flow FLOAT FORMAT '-ZZZZ9.99'
,Velocity FLOAT FORMAT '-ZZZ9.99'
,GageHeight FLOAT FORMAT '-ZZZ9.99'
,Temp FLOAT FORMAT '-ZZZ9.99' )
PRIMARY INDEX (SiteNo);

外部データをデータベース テーブルに挿入します。

INSERT INTO RiverFlowPermInsert_json
SELECT payload.datetime,payload.site_no,payload.Flow,payload.Velocity,payload.GageHeight,payload.Temp
WHERE payload.site_no='09429070'
FROM riverflow_json;

データベース テーブルのデータを問合わせます。

SELECT TOP 2 * FROM RiverFlowPermInsert_json;

<INSERT ... SELECTを使用したデータベースへの外部データのロード>を参照してください。

外部データとデータベース テーブルの結合

結合先のデータベース ディメンション テーブルを作成します。

CREATE SET TABLE rivernames(
site_no CHAR(8) CHARACTER SET LATIN NOT CASESPECIFIC,
name CHAR(100) CHARACTER SET LATIN NOT CASESPECIFIC)
UNIQUE PRIMARY INDEX ( site_no ) ;

ディメンション テーブルへのデータの入力に使用する外部テーブルを作成するか、データベース管理者に作成を依頼します。

CREATE FOREIGN TABLE nos_rivernames
, EXTERNAL SECURITY  MyAuthObj
USING ( LOCATION('/s3/td-usgs-public.s3.amazonaws.com/RIVERS/rivers.csv') );

ディメンション テーブルにデータを入力します。

INSERT INTO rivernames
SELECT CAST(site_no AS CHAR(8)), name
FROM nos_rivernames;

ディメンション テーブルと外部データ(外部テーブル)を結合します。

SELECT DISTINCT name(CHAR(100))
FROM riverflow_json rf, rivernames rn
WHERE rf.payload.site_no = cast(rn.site_no as INTEGER)
AND rf.payload.Precipitation > 0.1
ORDER BY 1;

<外部データとデータベース テーブルの結合>を参照してください。

外部テーブルのペイロード列でのフィルタリング

カスタムPATHPATTERNを使用して外部テーブルを作成するか、データベース管理者に作成を依頼します。

CREATE FOREIGN TABLE riverflow_json_path
, EXTERNAL SECURITY MyAuthObj
USING (
LOCATION ('/s3/td-usgs-public.s3.amazonaws.com/JSONDATA/')
PATHPATTERN('$data/$siteno/$year/$month/$day') );

ペイロード フィルタのみを使用してクエリーを実行します。

SELECT TOP 2 payload.GageHeight,payload.Flow
FROM riverflow_json_path
WHERE payload.site_no = '09394500';

フィルタ内の同等のパス値を使用して、同様のクエリーを実行します。

SELECT TOP 2 payload.GageHeight,payload.Flow
FROM riverflow_json_path
WHERE $path.$siteno = '09394500';

<外部テーブルのペイロード列でのフィルタリング>を参照してください。

パス フィルタリングを使用した外部テーブルの問合わせ

パス フィルタリングを使用して検索結果を絞り込みます。

SELECT TOP 2 payload.*
FROM riverflow_json_path
WHERE $PATH.$year = '2018'
AND $PATH.$month = '07'
AND $PATH.$day = '01.json'
AND $PATH.$siteno = '09394500';

<パス フィルタリングを使用した外部テーブルの問合わせ>を参照してください。

パスとペイロード フィルタリングの結合

パスとペイロード フィルタリングを組み合わせます。

SELECT COUNT(*)
FROM riverflow_json_path
WHERE payload.GageHeight > 5
AND $path.$siteno = '09394500'
AND $path.$year = '2018'
AND $path.$month = '07';

<パスとペイロード フィルタリングの結合>を参照してください。

基本ビューの作成

外部テーブルのビューを作成します。

CREATE VIEW riverflowview_json(site_no,datetime,flow,gageheight,precipitation,gageheight2) AS (
SELECT payload.site_no,payload.datetime,payload.Flow,payload.GageHeight,payload.Precipitation,payload.GageHeight2
FROM riverflow_json_path );

ビューを問合わせます。

SELECT TOP 2 * FROM riverflowview_json;

<基本ビューの作成>を参照してください。

ビュー内の列としてのパス変数の使用

REPLACE VIEW riverflowview_json AS (
SELECT
CAST($path.$siteno AS CHAR(10)) TheSite,
CAST($path.$year AS CHAR(4)) TheYear,
CAST($path.$month AS CHAR(2)) TheMonth,
CAST(SUBSTR($path.$day, 1, 2) AS CHAR(2)) TheDay,
payload.site_no site_no,
payload.datetime datetime,
payload.Flow Flow,
payload.GageHeight GageHieght,
payload.Precipitation Precipitation,
payload.GageHeight2 GageHeight2
FROM riverflow_json_path);

<ビュー内の列としてのパス変数の使用>を参照してください。

パス フィルタリングでの外部テーブル ビューの使用

外部テーブルのビューを置き換えます。

REPLACE VIEW riverflowview_json AS (
SELECT
CAST($path.$siteno AS CHAR(10)) TheSite,
CAST($path.$year AS CHAR(4)) TheYear,
CAST($path.$month AS CHAR(2)) TheMonth,
CAST($path.$day AS CHAR(2)) TheDay,
payload.site_no site_no,
payload.datetime datetime,
payload.Flow Flow,
payload.GageHeight GageHieght,
payload.Precipitation Precipitation,
payload.GageHeight2 GageHeight2
FROM riverflow_json_path
WHERE TheSite = payload.site_no);

ビューを問合わせます。

SELECT TOP 2 * FROM riverflowview_json;

ビューをフィルタ処理します。

SELECT thesite,COUNT(*)
FROM riverflowview_json WHERE thesite='09396100'
GROUP BY 1;

クエリーでEXPLAINを実行して、フィルタ処理がどのように行なわれているかを確認します。

EXPLAIN
SELECT thesite,COUNT(*)
FROM riverflowview_json WHERE thesite='09396100'
GROUP BY 1;

<パス フィルタリングでのビューの使用>を参照してください。