この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部コンサルティングチームの石川です。Amazon Redshift データベース、テーブル、カラムの名前など、識別子の大文字と小文字を区別するenable_case_sensitive_identifier
をサポートしました。早速、試してみます。
enable_case_sensitive_identifierをサポートのメリット
この世の中には、データベース名やテーブル名やカラム名が大文字以外受け付けないツールがあります。この場合は、一律、describe_field_name_in_uppercase
をON
にできるのですが、大文字、小文字、大文字と小文字の混在できませんでした。
今回、サポートされたenable_case_sensitive_identifier
を使えば、大文字、小文字、大文字と小文字の混在も対応できます。
大文字と小文字が混在したテーブル試してみる
下記の通り、大文字小文字混在、小文字のみ、大文字のみのカラム名が表示されています。テーブル名やカラム名にダブルクオートを付けるのを忘れないでください。
cmdb=# SET enable_case_sensitive_identifier TO true;
SET
cmdb=# CREATE TABLE "Venue"(
"venueId" smallint not null distkey sortkey,
"venuename" varchar(100),
"VENUENAME" varchar(30)
);
CREATE TABLE
cmdb=# \d
List of relations
Schema | Name | Type | Owner
--------+-------+-------+---------
public | Venue | table | awsuser
(1 row)
cmdb=# \d "Venue"
Table "public.Venue"
Column | Type | Collation | Nullable | Default
-----------+------------------------+-----------+----------+---------
venueId | smallint | | not null |
venuename | character varying(100) | | |
VENUENAME | character varying(30) | | |
引き続き、データの挿入と参照を試してみました。テーブル名やカラム名にダブルクオートを付けると問題ありません。
cmdb=# INSERT INTO "Venue"("venueId", "venuename", "VENUENAME")
VALUES(100, '日本武道館', 'nippon_budoukan');
INSERT 0 1
cmdb=# SELECT "venueId", "venuename", "VENUENAME" FROM "Venue";
venueId | venuename | VENUENAME
---------+------------+-----------------
100 | 日本武道館 | nippon_budoukan
(1 row)
cmdb=# SELECT * FROM "Venue";
venueId | venuename | VENUENAME
---------+------------+-----------------
100 | 日本武道館 | nippon_budoukan
(1 row)
もちろん、大文字と小文字を間違えるとエラーになります。
cmdb=# SELECT "venueid" FROM "Venue";
ERROR: column "venueid" does not exist in Venue
ここで、enable_case_sensitive_identifier
をFALSE
どうなるかというと、大文字・小文字が混在しているテーブル名を参照できなくなりました。
cmdb=# SET enable_case_sensitive_identifier TO FALSE;
SET
cmdb=# \d
List of relations
schema | name | type | owner
--------+-------+-------+---------
public | Venue | table | awsuser
(1 row)
cmdb=# SELECT * FROM "Venue";
ERROR: relation "venue" does not exist
UNLOADで大文字と小文字の混在したカラム名が出力できる
個人的に嬉しいポイントは、UNLOAD カラム名が自由に設定できる点です。集計したデータを外部に共有する場合、どうしてもno
をNo
、ユーザーid
ではなくユーザーID
でなければならないということがあり、この場合ヘッダを別途付与するなんてことがありました。
下記のように、出力したいヘッダのエイリアスをつけて、UNLOADすると、
cmdb=# SET enable_case_sensitive_identifier TO true;
SET
cmdb=# UNLOAD
('
SELECT
catid AS "Category ID",
catgroup AS "Category Group",
catname AS "Category Name",
catdesc AS "Category Description"
FROM tickit.category
')
TO 's3://cm-bucket/category_unload/category_'
IAM_ROLE 'arn:aws:iam::123456789012:role/cm-redshift-fullaccess-role'
HEADER
PARALLEL OFF;
INFO: UNLOAD completed, 11 record(s) unloaded successfully.
UNLOAD
ファイルのヘッダも大文字・小文字が混在して出力可能になります。
% aws s3 ls s3://cm-bucket/category_unload/
2021-04-28 19:45:02 0
2021-04-28 20:01:36 516 category_000
% aws s3 cp s3://cm-bucket/category_unload/category_000 -
Category ID|Category Group|Category Name|Category Description
2|Sports|NHL|National Hockey League
4|Sports|NBA|National Basketball Association
5|Sports|MLS|Major League Soccer
7|Shows|Plays|All non-musical theatre
9|Concerts|Pop|All rock and pop music concerts
10|Concerts|Jazz|All jazz singers and bands
1|Sports|MLB|Major League Baseball
3|Sports|NFL|National Football League
6|Shows|Musicals|Musical theatre
8|Shows|Opera|All opera and light opera
11|Concerts|Classical|All symphony, concerto, and choir concerts
まとめ
個人的には、UNLOAD カラム名が自由に設定できることが理由で、このブログを書いています。Redshiftを中心にデータ統合する Lake House Arcitectureにおいて、分析・集計したサマリデータを配布するときにこの機能は役に立つのではないかと考えています。