Amazon Redshift Update: cluster accessibilityが変更可能に/ソート実行時のNULL値の表示順序を指定可能に

2015.11.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本日(日本時間2015年11月21日午前)、Amazon Redshiftにおいて以下のリリースがなされました。『cluster accessibilityの変更』と『ソート実行時のNULL値の表示順序を指定可能に』という2つのトピックに関するものです。当エントリではその内容についてざっくりとではありますが見て行きたいと思います。

cluster accessibilityを動的に変更可能になりました

こちらはRedshiftクラスタ作成時にしか出来なかった『cluster accessibility』の項目を、クラスタ作成以後も動的に変更出来るようになった、というものです。これにより、運用当初は外部からのアクセスを遮断しておき、任意のタイミングで許可に切り替える、または逆パターンの切り替えを行なう事が出来るようになりました。起動後のクラスタの変更([Modify])でPublicly Accessibleの内容を切り替える事により、この部分の設定を変える事が出来ます。切り替え時のIP指定(任意のEIPでアクセス可能にする/Redshift側で払い出されるIPアドレスが設定されるもの)も併せて設定可能です。

amazon-redshift-release-20151121_02

この変更に併せて、AWS CLIでもaws redshift modify-clusterコマンドで変更出来るかな?と思いましたが、現時点(2015/11/21現在)のaws cliのバージョン(aws-cli/1.8.2 Python/2.7.6 Darwin/14.4.0)ではまだ対応していませんでした。この部分については近いうちに対応されるものと思いますので、対応を待ちたいと思います。

ソート実行時におけるNULL値の表示順序を指定可能になりました

この日Amazon Redshiftで機能追加されたもののうちのもう1つはこちら。クエリ実行の際のORDER BYによるソートで『NULL値の扱いをどうするか』を指定する事が出来るようになりました。

今回の対応を含めたシンタックスは以下の通り。

[ ORDER BY expression
[ ASC | DESC ]
[ NULLS FIRST | NULLS LAST ]  
[ LIMIT { count | ALL } ]
[ OFFSET start ]

検証用に以下のテーブルを作成し、データを投入します。

# CREATE TABLE public.null_sort_test (
   id INT NOT NULL,
   name VARCHAR(20) NOT NULL,
   nullable_value VARCHAR(40)
);
CREATE TABLE
# INSERT INTO public.null_sort_test VALUES(1,'AAA','The Force Awakens');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(2,'BBB','Revenge of the Sith');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(3,'CCC');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(4,'DDD');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(5,'EEE','The Phantom Menace');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(6,'FFF','A New Hope');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(7,'GGG','Return of the Jedi');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(8,'HHH');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(9,'III','Attack of the Clones');
INSERT 0 1
# INSERT INTO public.null_sort_test VALUES(10,'JJJ','The Empire Strikes Back');
INSERT 0 1
# COMMIT;

登録順(id)でソートするとこんな感じに並ぶデータ。

# SELECT * FROM public.null_sort_test ORDER BY id;
 id | name |     nullable_value      
----+------+-------------------------
  1 | AAA  | The Force Awakens
  2 | BBB  | Revenge of the Sith
  3 | CCC  | 
  4 | DDD  | 
  5 | EEE  | The Phantom Menace
  6 | FFF  | A New Hope
  7 | GGG  | Return of the Jedi
  8 | HHH  | 
  9 | III  | Attack of the Clones
 10 | JJJ  | The Empire Strikes Back
(10 rows)

NULLを含む項目(nullable_value)でソートを掛けると、以下の様な結果表示となりました。

# SELECT * FROM public.null_sort_test
  ORDER BY nullable_value;
  
 id | name |     nullable_value      
----+------+-------------------------
  6 | FFF  | A New Hope
  9 | III  | Attack of the Clones
  7 | GGG  | Return of the Jedi
  2 | BBB  | Revenge of the Sith
 10 | JJJ  | The Empire Strikes Back
  1 | AAA  | The Force Awakens
  5 | EEE  | The Phantom Menace
  3 | CCC  | 
  8 | HHH  | 
  4 | DDD  | 
(10 rows)

今回の対応で、ORDER BY句にオプションとしてNULLS FIRSTを付加して実行する事でNULL値の項目が先に表示され、

# SELECT * FROM public.null_sort_test
  ORDER BY nullable_value NULLS FIRST;
  
 id | name |     nullable_value      
----+------+-------------------------
  3 | CCC  | 
  8 | HHH  | 
  4 | DDD  | 
  6 | FFF  | A New Hope
  9 | III  | Attack of the Clones
  7 | GGG  | Return of the Jedi
  2 | BBB  | Revenge of the Sith
 10 | JJJ  | The Empire Strikes Back
  1 | AAA  | The Force Awakens
  5 | EEE  | The Phantom Menace
(10 rows)

また、NULLS LASTを付加して実行する事で指定無しと同様の結果が表示される事になるようになります。(デフォルト値はこちら)

Option that specifies whether NULL values should be ordered first, before non-null values, or last, after non-null values. By default, NULL values are sorted and ranked last in ASC ordering, and sorted and ranked first in DESC ordering.
# SELECT * FROM public.null_sort_test
  ORDER BY nullable_value NULLS LAST;
  
 id | name |     nullable_value      
----+------+-------------------------
  6 | FFF  | A New Hope
  9 | III  | Attack of the Clones
  7 | GGG  | Return of the Jedi
  2 | BBB  | Revenge of the Sith
 10 | JJJ  | The Empire Strikes Back
  1 | AAA  | The Force Awakens
  5 | EEE  | The Phantom Menace
  3 | CCC  | 
  8 | HHH  | 
  4 | DDD  | 
(10 rows)

メンテナンスリリースの情報によると、Redshiftクラスタのバージョンが1.0.1007になったタイミングでこの機能が使えるようになるようです。

$ aws redshift describe-clusters --cluster-identifier xxxxxxxxxxxxxx
 | jq '.Clusters[] | .ClusterVersion, .ClusterRevisionNumber'
"1.0"
"1003"

さいごに

どちらの機能も有効活用出来そうですね。特に前者については個人的にも対応を望んでいたので嬉しい限りです。こちらからは以上です。