Redshiftの新しいデータ型「VARBYTE」型がサポートされました

2021.12.09

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

先日、Redshiftの新しいデータ型「VARBYTE」型のサポートがアナウンスされていましたので、こちらをご紹介したいと思います。

利用可能なリージョン

すべてのリージョンで利用することができます。

VARBYTE型とは?

わたしもこれまで利用したことがなく、具体的に良いユースケースが思いつかないのですが「可変長のバイナリ文字列を格納および表現する可変長データ型」として利用できるデータ型となります。

ドキュメントに記載されているとおり、例えば文字列abcをVARBYTE型にすると616263となります。

select 'abc'::varbyte;
                      
 varbyte
---------
 616263

VARBYTE型はVARBYTE(n)のように明示的にサイズを指定して定義することも可能で、デフォルトでは64KB、最大1MBを指定できます。つまり、VARBYTE(1)からVARBYTE(1024000)まで指定可能となっています。

制約事項

2021年12月現在では、ドキュメントに記載のとおり、以下の制約事項があります。

  • Amazon Redshift Spectrumは、VARBYTEデータ型をサポートしていません。 したがって、VARBYTE列を使用して外部テーブルを作成または変更することはできません。
  • AmazonRedshiftクエリエディターとAmazon Redshiftクエリエディターv2は、VARBYTEデータ型をまだ完全にはサポートしていません。 したがって、VARBYTE式を操作するときは、別のSQLクライアントを使用してください。
  • クエリエディタを使用するための回避策として、データの長さが64KB未満でコンテンツが有効なUTF-8である場合、次のようにVARBYTE値をVARCHARにキャストできます。
select to_varbyte('6162', 'hex')::varchar;
  • PythonまたはLambdaユーザー定義関数(UDF)でVARBYTEデータ型を使用することはできません。
  • VARBYTE列をAmazon Redshiftテーブルのソートキーまたは分散キーとして使用することはできません。
  • VARBYTE列からHLLSKETCH列を作成したり、VARBYTE列に対してAPPROXIMATE、COUNT、DISTINCT関数を使用したりすることはできません。

試してみる

実際に少し試してみました。クエリエディタで試したので、今回はターミナルで文字列を16進数にしてからクエリで元に戻してみます。

まずは16進数を以下のようなコマンドで取得します。

$ echo "classmethod" | xxd -p
636c6173736d6574686f640a

$ echo "クラスメソッド" | xxd -p
e382afe383a9e382b9e383a1e382bde38383e383890a

なお、最後の0aは改行コードなので、実際には0aを削ったものをクエリで利用します。

クエリとしては、以下のようなクエリで試してみました。

SELECT TO_VARBYTE('636c6173736d6574686f64', 'hex')::VARCHAR;
                      
 to_varbyte
---------
 classmethod
SELECT TO_VARBYTE('e382afe383a9e382b9e383a1e382bde38383e38389', 'hex')::VARCHAR;
                      
 to_varbyte
---------
 クラスメソッド

想定通りになりましたね!

まとめ

以上、Redshiftの新しいデータ型「VARBYTE」型の紹介でした。

re:Inventの後も新しいリリース情報が入ってきてワクワクしますね。

どなたかのお役に立てば幸いです。それでは!