SQLを書いてデータウェアハウスやデータベースからデータを抽出するために必要な準備をしていきます。Amazon Redshiftに接続してデータを操作する場合、はじめにスキーマの設定をしてからデータを読み込みます。
スキーマを変更する
ここで言うスキーマ(schema)は、「データベースの構造」を意味します。
リレーショナルデータベースは、データを種類ごとにテーブル(表)の形でまとめることで、様々なデータセットを整理整頓して保管しているイメージだと思います。データを複数のテーブルにまとめて管理することで、高い検索能力を実現させているようです。
スキーマはテーブルよりも大きな枠組みのもので、テーブルを格納しておく場所のことを指します。スキーマを確認することで、どのようなデータテーブルがあるのか(データベースの構造がどうなっているのか)がわかるわけです。
また、1つのデータベースを複数人で操作する場合、各人が自分専用のスキーマを作り、そこに必要なテーブルを入れておくことで、お互いに干渉し合うことなく作業することができます。嬉しい。
それではまず、現在のスキーマが何になっているか確認してみましょう。
SHOW search_path;
SQLでは1つ命令を書き終えたところで「;」を入れます。
必要に応じてsearch_path
を変更しましょう。「name
」のところに好きな名前を書いてください。
SET search_path TO name;
実行すると、「Current schema changed to name」と表示されると思います。もう一度「SHOW search_path;
」を実行してみると、「search_path
」が「name
」になっているはずです。スキーマとその中身は「Database Explorer」タブから確認することができます(まだこの時点ではデータを読み込ませていないため、何も入っていないと思います)。「Database Explorer」タブはWindowsだと[ctrl] + [D]で起動させることができます。
データを読み込む
スキーマの設定を確認することができたので、データを読み込んでいきたいと思います。はじめにテーブルを作ってから、その中にデータを入れていきます。
データがAWSのストレージなど別の場所に格納されている場合(外部ファイルのデータの場合)は「COPY
」文を使います。「FROM
」のところでデータ格納場所のパスを指定しましょう。
-- 同じ名前のテーブルがあったら消しておく
DROP TABLE IF EXISTS data;
-- テーブルを作る
-- 列名とそこに入るデータの型を指定
CREATE TABLE data(
column_name1 varchar(100)
, column_name2 varchar(100)
);
-- 上で作ったテーブルにデータを入れる
COPY
data
FROM
's3://..(パス名)../data.txt' -- AWSのストレージから持ってくる
IAM_ROLE
'接続情報'
DELIMITER
'¥t' -- タブ区切りの場合
IGNOREHEADER
1 -- 先頭1行を読み込まない場合
DATEFORMAT
'auto'
;
「CREATE TABLE data()
」のところで指定できるデータ型はたくさんあります。例えば、ここで書いている「varchar()
」は文字数がいろいろな文字列型です。括弧の中には文字数の上限を記載します。
データの内容を直接書くことでデータを読み込むこともできます。その場合は「INSERT
」文を使います。
-- 同じ名前のテーブルがあったら消しておく
DROP TABLE IF EXISTS data2;
-- テーブルを作る
-- 列名とそこに入るデータの型を指定
CREATE TABLE data2(
column_name1 INT NOT NULL -- NULLは格納しない
, column_name2 INT DEFAULT NULL
);
-- 上で作ったテーブルにデータを入れる
INSERT INTO data2(column_name1, column_name2) VALUES
(1, 2)
, (3, 4)
;
ここで書いたような根性インプット(データの値を手入力していく方法)だけでなく、CASE文(SQLのif文)を使って書き込むこともできます。「VALUES
」の後に値が入ればいいので、クエリを発行して値を求めて書き込むということもできちゃうそうです。
こうしてデータが読み込めたら、いよいよデータ抽出・加工・集計をしていきます。
以上、SQLでデータを抽出するために必要な準備に関してでした。まだあまりよくわかっていないところもあるので、間違いに気づき次第、加筆修正していきます。