圧縮エンコードとその種類について勉強

圧縮エンコードについてよくわかっていなかったので調べました。
まずは圧縮とは何かというのがまとまっている記事を探して、以下の記事がわかりやすかったです。

tom-51.net

www.ycc.u-tokai.ac.jp

記事を参考にしつつ、自分の理解を書きます。

ファイルの圧縮とは、ファイルの情報は失わずに複数のファイルを一つの圧縮ファイルにまとめて、データサイズを小さくすること。

メリットとしては以下があります。(上で書いていることほぼそのまま)

  • 複数のファイルを一つの圧縮ファイルにまとめることによる転送速度の向上

  • ファイルの容量がある程度小さくなる

デメリットとしては圧縮と解凍の作業が必要ということ。

特にデータを自動でRedshiftに取り込む処理を実装する場合は、Pythonなどでファイルのエンコーディングが必要になる。

というのが基本的な圧縮に対する認識でいいはず(後々自分の認識の間違いなどに気づいたらまた似たような記事書きます)

そして、以下のドキュメントでAmazon Redshiftで対応している圧縮エンコード一覧が記載されています。

docs.aws.amazon.com

上記ページ読みながら自分の理解をまとめていきます。

  • 圧縮エンコードとは、行がテーブルに追加されるときにデータの列に適用される圧縮タイプのこと。

  • データ型ごとに指定できるエンコードタイプが決まっている。

  • raw エンコード
    非圧縮のraw形式。全てのデータ型に適用できる。

  • AZ64 エンコード
    高い圧縮率とクエリ処理能力を改善するためAmazonによって設計された独自の圧縮エンコードアルゴリズム
    SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP, TIMESTAMPTZに適用できる。

  • バイトディクショナリ
    CAHR列に長い文字列が含まれる場合に特に空間効率が高まる。
    しかしVARCHAR列に使うとディスクの使用率が上限を超える場合があるので効果的とは限らない。VARCHARに対してはLZOなどが推奨されている。
    SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE PRECISION、CHAR、VARCHAR、DATE、TIMESTAMP、TIMESTAMPTZに適用できる。

  • デルタ エンコード
    デルタは日時列に効果的。

  • LZO エンコード
    LZOは長い文字列を格納するCHAR列及びVARCHAR列に対して効果的。説明やコメントなど自由形式テキストのカラムなどに適している。
    SMALLINT、INTEGER、BIGINT、DECIMAL、CHAR、VARCHAR、DATE、TIMESTAMP、TIMESTAMPTZ、SUPERに適用できる。

  • Mostly エンコード
    数値の数に合わせてMOSTLYのビット数を指定して圧縮する。
    MOSTLY8は-128~127、MOSTLY16は-32768~32767、MOSTLY32は-2147483648~+2147483647を圧縮でき、それぞれ範囲外の値はrawとして格納される。

  • ランレングス エンコード
    ランレングスはデータ値が連続して使われる場合に適している。
    ソートキーとして指定された列に適用することは推奨されていない。
    SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE PRECISION、CHAR、VARCHAR、DATE、TIMESTAMP、TIMESTAMPTZに適用できる。

  • Text255およびText32k
    同じ単語が頻繁に出現するVARCAHR列を圧縮する場合に有用。
    VARCHARに適用できる。

  • ZSTD エンコード
    説明、コメント、ログなど長さがさまざまな文字列を保存するCHAR及びVARCHAR列に対して特に効果的。
    SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZに適用できる。

以上です。