Amazon TimestreamでCSVエクスポートとインポートを行う方法

記事タイトルとURLをコピーする

こんにちは。
アプリケーションサービス部の兼安です。
本記事は、Amazon TimestreamでCSVエクスポートとインポートを行う方法を紹介します。

はじめに

Amazon Timestreamはマネージドの時系列データベースです。

aws.amazon.com

Amazon TimestreamではSQLを使用できますが、RDBとは似て非なるものです。
単純なINSERT・DELETE文は使えないので、テストデータの作成は少々手間がかかります。

そこで、今回は、Amazon TimestreamでCSVのエクスポートとインポートを行う方法について紹介します。

UNLOAD機能を用いてCSVでエクスポートする

CSVエクスポートは、UNLOADという機能を使用します。
なお、Amazon Timestreamにはバックアップというメニューがありますが、こちらはファイル出力ではないので今回の用途には向いていません。

docs.aws.amazon.com

UNLOAD (SELECT * FROM "テーブル名"."データベース名")
TO 's3://バケット名'
WITH ( include_header = 'true' )

このようなSQLを、クエリエディタで実行すると、S3バケットにSQLの実行結果をエクスポートできます。
フォーマットは、CSVPARQUETが選択できて、何も指定しなければCSVになることを確認しました。
ヘッダは何も指定しなければ付かないので、WITH ( include_header = 'true' )を付けるとよいと思います。
その他のオプションは上述のリンク先をご覧ください。

クエリエディタでUNLOADを実行する

クエリを実行すると、画面下にエクスポート結果が表示されます。
結果フォルダをクリックすると、出力先のS3バケットに移動できます。

UNLOADの結果は、クエリ結果の欄に出る

UNLOADの結果が出力されたS3バケット

gzファイルをダウンロード、解凍するとCSVファイルが得られます。
このCSVファイルをインポートに活用することができます。

UNLOADしたCSVファイル

バッチロードタスクを用いてCSVをインポートする

CSVのインポートは、Amazon Timestreamのバッチロードタスクという機能を使用します。

aws.amazon.com

インポート用のCSVデータ

用意したCSVデータは以下の通りです。
このファイルをS3バケットにアップして使用します。
タイムスタンプはUTCであることに注意してください。

インポート用のCSVデータをExcelで作成

このCSVは、UNLOADで出力したCSVをベースにしていますが、time列を日付文字列からタイムスタンプに変換しています。
日付文字列のままだと、タイムスタンプとして認識されず、インポート時にエラーなることを確認しました。
回避策はあるかもしれませんが、タイムスタンプに変換した方が早かったのでそのようにしています。

タイムスタンプへの変換には、以下のExcelの式を使用しました。

=(A1 - DATE(1970,1,1)) * 86400

バッチロードタスクの実行

では、バッチロードタスクを実行していきます。
まずは、Amazon Timestreamのメニューでバッチロードタスクを選択し、バッチロードタスクを作成をクリックします。

バッチロードタスクの作成

ターゲットのデータベースとテーブル、インポート元となるファイルをS3バケットから選択します。

インポート先とデータソースの指定

ファイル形式のデフォルトはCSVです。
区切り文字などを変更したければ、指定します。

ファイル形式の設定

データモデルマッピングは、今回はビジュアルビルダーを選択し、手動でマッピングを設定することにします。

データモデルマッピングの選択

データソース列をロードをクリックするとS3にあるファイルをロードし、列定義が表示されます。

データソース列をロード

CSVとテーブルの列名が一致していれば、ソース列名ターゲットテーブルの列名は自動で埋まります。
Timestream属性タイプは初期は空白なので選択をします。
測定値はMULTIを指定し、型を個別に指定しないといけないことに注意です。

マッピングは載っているものは全て定義しないといけないので不要なものはチェックして列マッピングを削除で削除します。

マッピング

エラーログレポートの格納先を設定したら、次へをクリックします。

エラーログレポートの設定

確認画面が表示されます。
この時、JSONが表示されるので、これを控えておくと同じ設定でバッチロードタスクを作る時に活用できます。

確認画面

確認画面で定義のJSONがコピー可能

確認が完了したら、バッチロードタスクを作成をクリックします。
一覧画面に戻り、タスクが開始したことが確認できます。
タスクが完了した、クエリエディタでレコードを確認できるはずです。

一覧でタスクの開始を確認できる

タスクの完了

JSONを使用したバッチロードタスク

上述の手順ではビジュアルビルダーでマッピングを作りましたが、マッピングはJSONでも定義可能です。
この時、先ほど触れた確認画面で表示されたJSONがあれば、JSONエディターに貼り付けることで同じマッピングを再現することができます。

JSONによるデータモデルマッピング

補足

バッチロードタスクが認識する列は100列まで

現状、バッチロードタスクが認識する列は100列までのようです。 100列を超えるCSVを指定すると、以下のメッセージが表示されます。

バッチロードタスクが認識する列は100列まで

新規テーブルに対するバッチロードタスク

バッチロードタスクにおいて、データのインポート先のデータベースとテーブルは新規でも既存でも問題ありません。
Amazon TimestreamはスキーマレスのDBなので、テーブルが新規の場合列定義が存在しませんが、インポート同時に列定義ができて正常に登録されることを確認しました。

バッチロードタスクの実行中の注意

バッチロードタスクの実行中に他から書き込みを行うと、エラーが起きることがあるようなので注意してください。 Amazon Timestream新機能紹介と実演

バッチロードタスクの実行中は、同じテーブルへのデータ書き込みはタス クのエラーにつながる可能性があり、避けた方が良い

兼安 聡(執筆記事の一覧)

アプリケーションサービス部 DS1課所属
AWS12冠。
広島在住です。
最近認定スクラムマスターになりました。今日も明日も修行中です。