V3.1 以降、Hologres では hg_presto_funcs 拡張を介して Presto 互換関数がサポートされます。本トピックで紹介するすべての関数は、Velox 実行エンジン によって実装されています。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
V3.1 以降のバージョンを実行している Hologres インスタンス
対象データベースへの Superuser アクセス権限
拡張のインストール
Superuser として以下の文を実行します。この操作はデータベース単位で 1 回実行すればよく、新しいデータベースを作成した場合は再度実行してください。
CREATE EXTENSION hg_presto_funcs;説明
この拡張は hg_presto_funcs スキーマにのみインストールされます。他のスキーマを指定することはできません。
Presto 関数の呼び出し
すべての Presto 関数は hg_presto_funcs スキーマ内に配置されています。これらの関数を呼び出すには、関数名の先頭にスキーマ名を付与する方法か、セッション単位で検索パスを設定する方法のいずれかを選択してください。
-- オプション 1:各呼び出しにプレフィックスを付与
SELECT hg_presto_funcs.array_cum_sum(b) FROM public.presto_test;
-- オプション 2:セッション単位で検索パスを設定
SET search_path = hg_presto_funcs;
SELECT array_cum_sum(b) FROM public.presto_test;重要
これらの関数は定数入力パラメーターをサポートしません。本トピックのすべての例では、以下に示すサンプルテーブルの列参照を使用しています。
サンプルテーブル
本トピックの例では、以下のテーブルを使用します。
CREATE TABLE public.presto_test(
a INT, b INT[], c TEXT, d TEXT, e TEXT, f TEXT, g TEXT,
h TEXT, i TEXT, j TEXT, k TEXT, l TEXT, m TEXT, n TEXT,
o TEXT, p TEXT, r TEXT, s TEXT, t FLOAT, u TEXT
);
INSERT INTO public.presto_test
VALUES (
3, ARRAY[1, 2, 3, 2], 'A', '10010', 'SGVsbG8gV29ybGQh',
'\x00000001', '\x0000000000000001', '48656C6C6F',
'\x40490FD0', '\x400921FB54442D18', '\x48656C6C6F',
'"dwdw"', '[1,2,3,4,5,6]', '{"x": {"a": 1, "b": 2}}',
'café', 'apple,banana,cherry', 'ABCDA', 'running',
3.1415926, '[1.0,2.0]'
);サポートされる関数
以下の表では、カテゴリ別に分類されたすべてのサポート関数を一覧表示します。各エントリには、パラメーターおよび戻り値の型を含む関数シグネチャを記載しています。
配列関数
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
array_cum_sum(array(bigint)) → array(bigint) | 位置 n に、先頭から n 番目までの要素の合計値を格納した配列を返します。先頭から n 番目までの要素のいずれかが NULL の場合、位置 n には NULL を返します。 | SELECT array_cum_sum(b) FROM public.presto_test; | {1,3,6,8} |
array_has_duplicates(array(T)) → boolean | 配列に重複する要素が含まれる場合に true を返します。 | SELECT array_has_duplicates(b) FROM public.presto_test; | t |
array_join(array(T), varchar) → varchar | 指定された区切り文字を使用して、配列要素を文字列に連結します。 | SELECT array_join(b, ';') FROM public.presto_test; | 1;2;3;2 |
remove_nulls(array(T)) → array(T) | 配列から NULL 値を削除します。 | SELECT remove_nulls(b) FROM public.presto_test; | {1,2,3,2} |
trim_array(array(T), bigint) → array(T) | 配列の末尾から n 個の要素を削除します。 | SELECT trim_array(b, 2) FROM public.presto_test; | {1,2} |
ビット演算関数
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
bit_count(bigint, bigint) → bigint | 指定されたビット幅内で、値のうち立っているビット(ハミング重み)の数をカウントします。 | SELECT bit_count(a, 32) FROM public.presto_test; | 2 |
bitwise_and(bigint, bigint) → bigint | 2 つの整数のビットごとの AND を返します。 | SELECT bitwise_and(a, 2) FROM public.presto_test; | 2 |
bitwise_or(bigint, bigint) → bigint | 2 つの整数のビットごとの OR を返します。 | SELECT bitwise_or(a, 2) FROM public.presto_test; | 3 |
bitwise_xor(bigint, bigint) → bigint | 2 つの整数のビットごとの XOR を返します。 | SELECT bitwise_xor(a, 2) FROM public.presto_test; | 1 |
bitwise_not(bigint) → bigint | 整数のビットごとの NOT を返します。 | SELECT bitwise_not(a) FROM public.presto_test; | -4 |
bitwise_left_shift(bigint, bigint) → bigint | 値を n ビット左シフトします。 | SELECT bitwise_left_shift(a, 1) FROM public.presto_test; | 6 |
bitwise_shift_left(bigint, bigint, bigint) → bigint | 指定されたビット幅内で、値を n ビット左シフトします。 | SELECT bitwise_shift_left(a, 1, 32) FROM public.presto_test; | 6 |
bitwise_right_shift(bigint, bigint) → bigint | 値を n ビット右シフトします(論理シフト、ゼロ埋め)。 | SELECT bitwise_right_shift(a, 1) FROM public.presto_test; | 1 |
bitwise_logical_shift_right(bigint, bigint, bigint) → bigint | 指定されたビット幅内で、値を n ビット右シフトします(論理シフト、ゼロ埋め)。 | SELECT bitwise_logical_shift_right(a, 1, 32) FROM public.presto_test; | 1 |
bitwise_arithmetic_shift_right(bigint, bigint) → bigint | 符号ビットを保持したまま値を n ビット右シフトします(算術右シフト)。 | SELECT bitwise_arithmetic_shift_right(a, 1) FROM public.presto_test; | 1 |
bitwise_right_shift_arithmetic(bigint, bigint) → bigint | bitwise_arithmetic_shift_right のエイリアスです。符号ビットを保持したまま値を n ビット右シフトします。 | SELECT bitwise_right_shift_arithmetic(a, 1) FROM public.presto_test; | 1 |
bitwise_right_shiftおよびbitwise_logical_shift_rightは、空いたビット位置をゼロで埋めます。bitwise_arithmetic_shift_rightおよびbitwise_right_shift_arithmeticは、符号ビットで埋めます。したがって、負の整数に対してはこれらは等価となります。
バイナリおよびハッシュ関数
汎用的なハッシュ化には、xxhash64を使用してください。これはcrc32やspooky_hash_v2_*よりも大幅に高速であり、より優れたハッシュ品質を提供します。hmac_*関数は、鍵付き認証コードが必要な場合に使用します。crc32は、既にこれに依存しているシステムとの互換性を確保する場合にのみ使用してください。
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
crc32(varbinary) → bigint | バイナリデータの CRC32 チェックサムを計算します。 | SELECT crc32(bin(a)::bytea) FROM public.presto_test; | 3596227959 |
xxhash64(varbinary) → varbinary | バイナリデータの xxHash64 ハッシュを計算し、64 ビットのバイナリ結果を返します。 | SELECT xxhash64(r::BYTEA) FROM public.presto_test; | \x616f621d4581935f |
spooky_hash_v2_32(varbinary) → varbinary | バイナリデータの SpookyHashV2 32 ビットハッシュを計算します。 | SELECT spooky_hash_v2_32(r::BYTEA) FROM public.presto_test; | \x4a6ed4f7 |
spooky_hash_v2_64(varbinary) → varbinary | バイナリデータの SpookyHashV2 64 ビットハッシュを計算します。 | SELECT spooky_hash_v2_64(r::BYTEA) FROM public.presto_test; | \x2d89595e4a6ed4f7 |
hmac_md5(varbinary, varchar) → varbinary | 指定されたキーと MD5 を使用して HMAC を計算します。 | SELECT hmac_md5(k::BYTEA, 'secret_key') FROM public.presto_test; | \x52460d22ec7e402dc8c62aeda51ec920 |
hmac_sha1(varbinary, varchar) → varbinary | 指定されたキーと SHA-1 を使用して HMAC を計算します。 | SELECT hmac_sha1(k::BYTEA, 'secret_key') FROM public.presto_test; | \xf8b6b3ee753fe1d8052cf317b0b4606089c85b19 |
hmac_sha256(varbinary, varchar) → varbinary | 指定されたキーと SHA-256 を使用して HMAC を計算します。 | SELECT hmac_sha256(k::BYTEA, 'secret_key') FROM public.presto_test; | \x0f0d2e10ec2bdf21bbdf490fd103820089879277261e9aa53ce3f8ecfd46b687 |
hmac_sha512(varbinary, varchar) → varbinary | 指定されたキーと SHA-512 を使用して HMAC を計算します。 | SELECT hmac_sha512(k::BYTEA, 'secret_key') FROM public.presto_test; | \x99376d305f3c2e729e60eb1e096fc364b8564452c4089b509c5d0d6e63608a43f14643a82880f156bf7df5ce32ba6bc35e36980772f9199b1cf43793e9bbd545 |
sha1(varbinary) → varchar | バイナリデータの SHA-1 ハッシュを計算し、16 進数文字列として返します。 | SELECT sha1(a::text::bytea) FROM public.presto_test; | 77de68daecd823babbb58edb1c8e14d7106e83bb |
from_base64(varchar) → varbinary | 標準 Base64 エンコーディングされた文字列をバイナリにデコードします。 | SELECT from_base64(e) FROM public.presto_test; | \x48656c6c6f20576f726c6421 |
to_base64(varbinary) → varchar | バイナリデータを標準 Base64 文字列としてエンコードします。 | SELECT to_base64(r::BYTEA) FROM public.presto_test; | QUJDREE= |
from_base64url(varchar) → varbinary | URL 安全な Base64 エンコーディングされた文字列をバイナリにデコードします。 | SELECT from_base64url(e) FROM public.presto_test; | \x48656c6c6f20576f726c6421 |
to_base64url(varbinary) → varchar | バイナリデータを URL 安全な Base64 文字列としてエンコードします。 | SELECT to_base64url(r::BYTEA) FROM public.presto_test; | QUJDREE= |
from_hex(varchar) → varbinary | 16 進数文字列をバイナリにデコードします。 | SELECT from_hex(h) FROM public.presto_test; | \x48656c6c6f |
from_big_endian_32(varbinary) → bigint | 32 ビットのビッグエンディアン 2 の補数バイナリ値を bigint にデコードします。 | SELECT from_big_endian_32(f::BYTEA) FROM public.presto_test; | 1 |
to_big_endian_32(bigint) → varbinary | 整数を 32 ビットのビッグエンディアン 2 の補数バイナリ値としてエンコードします。 | SELECT to_big_endian_32(a) FROM public.presto_test; | \x00000003 |
from_big_endian_64(varbinary) → bigint | 64 ビットのビッグエンディアン 2 の補数バイナリ値を bigint にデコードします。 | SELECT from_big_endian_64(g::BYTEA) FROM public.presto_test; | 1 |
to_big_endian_64(bigint) → varbinary | 整数を 64 ビットのビッグエンディアン 2 の補数バイナリ値としてエンコードします。 | SELECT to_big_endian_64(a) FROM public.presto_test; | \x0000000000000003 |
from_ieee754_32(varbinary) → real | 32 ビットのビッグエンディアン IEEE 754 バイナリ値を単精度浮動小数点数にデコードします。 | SELECT from_ieee754_32(i::BYTEA) FROM public.presto_test; | 3.14159012 |
to_ieee754_32(real) → varbinary | 単精度浮動小数点数を 32 ビットのビッグエンディアン IEEE 754 バイナリ値としてエンコードします。 | SELECT to_ieee754_32(a::REAL) FROM public.presto_test; | \x40400000 |
from_ieee754_64(varbinary) → double | 64 ビットのビッグエンディアン IEEE 754 バイナリ値を倍精度浮動小数点数にデコードします。 | SELECT from_ieee754_64(j::BYTEA) FROM public.presto_test; | 3.141592653589793 |
to_ieee754_64(double) → varbinary | 倍精度浮動小数点数を 64 ビットのビッグエンディアン IEEE 754 バイナリ値としてエンコードします。 | SELECT to_ieee754_64(a::FLOAT) FROM public.presto_test; | \x4008000000000000 |
from_base(varchar, bigint) → bigint | 文字列を指定された基数で解釈し、10 進数の値を返します。 | SELECT from_base(d, 2) FROM public.presto_test; | 18 |
to_base(bigint, bigint) → varchar | 整数を指定された基数での文字列表現に変換します。 | SELECT to_base(a, 2) FROM public.presto_test; | 11 |
数学および統計関数
一般的な数学
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
clamp(double, double, double) → double | 値を [min, max] の範囲に制限します。値が範囲内であればその値を返し、範囲外であれば最も近い境界値を返します。 | SELECT clamp(a, 2, 9) FROM public.presto_test; | 3 |
cosh(double) → double | 値の双曲線余弦を返します。 | SELECT cosh(a) FROM public.presto_test; | 10.067661995777765 |
tanh(double) → double | 値の双曲線正接を返します。 | SELECT tanh(a) FROM public.presto_test; | 0.9950547536867305 |
log2(double) → double | 値の底 2 の対数を返します。 | SELECT log2(a) FROM public.presto_test; | 1.584962500721156 |
log10(double) → double | 値の底 10 の対数を返します。 | SELECT log10(a) FROM public.presto_test; | 0.47712125471966244 |
minus(double, double) → double | 2 つの数値の差 (x − y) を返します。 | SELECT minus(a, 1) FROM public.presto_test; | 2 |
negate(double) → double | 値の否定を返します。 | SELECT negate(a) FROM public.presto_test; | -3 |
truncate(double, integer) → double | 値を小数点以下 n 桁まで切り捨てます。 | SELECT truncate(t, 2) FROM public.presto_test; | 3.14 |
is_finite(double) → boolean | 値が有限である場合に true を返します。 | SELECT is_finite(a) FROM public.presto_test; | t |
is_infinite(double) → boolean | 値が無限である場合に true を返します。 | SELECT is_infinite(a) FROM public.presto_test; | f |
is_nan(double) → boolean | 値が NaN(Not-a-Number)である場合に true を返します。 | SELECT is_nan(a) FROM public.presto_test; | f |
secure_rand() → double | [0, 1) の範囲で暗号学的に安全な乱数の double 値を返します。 | SELECT secure_rand() FROM public.presto_test; | 0.22077085443234523 |
secure_random() → double | secure_rand のエイリアスです。[0, 1) の範囲で暗号学的に安全な乱数の double 値を返します。 | SELECT secure_random() FROM public.presto_test; | 0.3414298654539425 |
累積分布関数(CDF)
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
beta_cdf(double, double, double) → double | 指定された形状パラメーターを持つベータ分布の累積分布関数(CDF)を返します。 | SELECT beta_cdf(2, a, 0.5) FROM public.presto_test; | 0.6875 |
binomial_cdf(bigint, double, bigint) → double | 二項分布の CDF を返します。 | SELECT binomial_cdf(6, 0.5, a) FROM public.presto_test; | 0.65625 |
cauchy_cdf(double, double, double) → double | コーシー分布の CDF を返します。 | SELECT cauchy_cdf(2, a, 0.5) FROM public.presto_test; | 0.6024163823495667 |
chi_squared_cdf(double, double) → double | カイ二乗分布の CDF を返します。 | SELECT chi_squared_cdf(a, 4) FROM public.presto_test; | 0.7385358700508894 |
f_cdf(double, double, double) → double | F 分布の CDF を返します。 | SELECT f_cdf(2, a, 0.5) FROM public.presto_test; | 0.350480947161671 |
gamma_cdf(double, double, double) → double | ガンマ分布の CDF を返します。 | SELECT gamma_cdf(2, a, 0.5) FROM public.presto_test; | 0.012437987627616913 |
laplace_cdf(double, double, double) → double | ラプラス分布の CDF を返します。 | SELECT laplace_cdf(0, 1, a) FROM public.presto_test; | 0.9751064658160681 |
normal_cdf(double, double, double) → double | 指定された平均および標準偏差を持つ正規分布の CDF を返します。 | SELECT normal_cdf(0, 1, a) FROM public.presto_test; | 0.9986501019683699 |
poisson_cdf(double, bigint) → double | ポアソン分布の CDF を返します。 | SELECT poisson_cdf(1, a) FROM public.presto_test; | 0.9810118431238462 |
weibull_cdf(double, double, double) → double | ワイブル分布の CDF を返します。 | SELECT weibull_cdf(2, a, 1.5) FROM public.presto_test; | 0.22119921692859512 |
inverse_beta_cdf(double, double, double) → double | ベータ分布の逆 CDF を返します。 | SELECT inverse_beta_cdf(2, a, 0.6875) FROM public.presto_test; | 0.5 |
inverse_cauchy_cdf(double, double, double) → double | コーシー分布の逆 CDF を返します。 | SELECT inverse_cauchy_cdf(2, a, 0.5) FROM public.presto_test; | 2 |
inverse_laplace_cdf(double, double, double) → double | ラプラス分布の逆 CDF を返します。 | SELECT inverse_laplace_cdf(a, 1, 0.5) FROM public.presto_test; | 3 |
inverse_normal_cdf(double, double, double) → double | 指定された平均および標準偏差を持つ正規分布の逆 CDF を返します。 | SELECT inverse_normal_cdf(a, 1, 0.5) FROM public.presto_test; | 3 |
inverse_weibull_cdf(double, double, double) → double | ワイブル分布の逆 CDF を返します。 | SELECT inverse_weibull_cdf(2, a, 0.5) FROM public.presto_test; | 2.497663833473093 |
wilson_interval_lower(bigint, bigint, double) → double | ベルヌーイ試行における、指定された信頼度 z に対するウィルソン信頼区間の下限を返します。 | SELECT wilson_interval_lower(a, 20, 1.96) FROM public.presto_test; | 0.05236779195949585 |
wilson_interval_upper(bigint, bigint, double) → double | ベルヌーイ試行における、指定された信頼度 z に対するウィルソン信頼区間の上限を返します。 | SELECT wilson_interval_upper(a, 20, 1.96) FROM public.presto_test; | 0.3604232958869574 |
文字列および Unicode 関数
これらの関数は、ユーザーが視認する文字(グラフェムクラスター)ではなく、Unicode コードポイントに対して動作します。入力文字列は有効な UTF-8 形式である必要があります。
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
codepoint(varchar) → integer | 単一文字の Unicode コードポイントを返します。 | SELECT codepoint(c) FROM public.presto_test; | 65 |
ends_with(varchar, varchar) → boolean | 文字列が指定された接尾辞で終わる場合に true を返します。 | SELECT ends_with(concat(a, 'hologres'), 'gres') FROM public.presto_test; | t |
hamming_distance(varchar, varchar) → bigint | 2 つの文字列間のハミング距離(文字が異なる位置の数)を返します。 | SELECT hamming_distance(e, 'SGVsBG7gV39ybGQh') FROM public.presto_test; | 3 |
levenshtein_distance(varchar, varchar) → bigint | 2 つの文字列間のレーベンシュタイン距離(編集距離)を返します。 | SELECT levenshtein(a::text, 'hologres') FROM public.presto_test; | 8 |
normalize(varchar) → varchar | 文字列を NFC 正規化形式に変換します。 | SELECT normalize(o) FROM public.presto_test; | café |
regexp_split(varchar, varchar) → array(varchar) | 正規表現を使用して文字列を分割し、その部分を配列として返します。 | SELECT regexp_split(p, ',') FROM public.presto_test; | {"apple","banana","cherry"} |
strrpos(varchar, varchar) → bigint | 文字列内の部分文字列の最後の出現位置を返します。 | SELECT STRRPOS(r, 'A') FROM public.presto_test; | 5 |
trim(varchar, varchar) → varchar | 文字列の両端から指定された文字の出現を削除します。 | SELECT trim(r, 'A') FROM public.presto_test; | BCD |
word_stem(varchar, varchar) → varchar | 指定された言語で単語の語幹を返します。英語の場合は 'en'、中国語の場合は 'zn' を指定します。 | SELECT word_stem(s, 'en') FROM public.presto_test; | run |
比較関数
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
eq(T, T) → boolean | 2 つの値が等しい場合に true を返します。 | SELECT eq(c, 'A') FROM public.presto_test; | t |
neq(T, T) → boolean | 2 つの値が等しくない場合に true を返します。 | SELECT neq('A', c) FROM public.presto_test; | f |
gt(varchar, varchar) → boolean | x > y の場合に true を返します。 | SELECT gt('B', c) FROM public.presto_test; | t |
gte(varchar, varchar) → boolean | x ≥ y の場合に true を返します。 | SELECT gte('A', c) FROM public.presto_test; | t |
lt(varchar, varchar) → boolean | x < y の場合に true を返します。 | SELECT lt('ABCDA', c) FROM public.presto_test; | f |
lte(varchar, varchar) → boolean | x ≤ y の場合に true を返します。 | SELECT lte('A', c) FROM public.presto_test; | t |
JSON 関数
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
is_json_scalar(varchar) → boolean | 値が JSON スカラー(オブジェクトまたは配列ではない)である場合に true を返します。 | SELECT is_json_scalar(l) FROM public.presto_test; | t |
json_array_contains(varchar, T) → boolean | JSON 配列が指定された値を含む場合に true を返します。 | SELECT json_array_contains(u, 2) FROM public.presto_test; | t |
json_extract_scalar(varchar, varchar) → varchar | 指定された JSONPath で JSON 文字列からスカラー値を抽出します。 | SELECT json_extract_scalar(m, '$[1]') FROM public.presto_test; | 2 |
json_size(varchar, varchar) → bigint | 指定された JSONPath で JSON オブジェクトまたは配列の要素数を返します。 | SELECT json_size(n, '$.x') FROM public.presto_test; | 2 |
URL 関数
URL 抽出は、RFC 2396 で定義された URI 構文に従います。
[protocol:][//host[:port]][path][?query][#fragment]抽出されたコンポーネントには、: や ? などの URI 構文区切り文字は含まれません。
| 関数シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|
url_decode(varchar) → varchar | URL エンコードされた文字列をデコードします。 | SELECT url_decode(url_encode(concat('www.', '中文', a, '.com'))) FROM public.presto_test; | www.中文3.com |
url_encode(varchar) → varchar | 特殊文字をエスケープして文字列を URL エンコードします。 | SELECT url_encode(concat('www.', '中文', a, '.com')) FROM public.presto_test; | www.%E4%B8%AD%E6%96%873.com |
url_extract_fragment(varchar) → varchar | URL からフラグメント識別子を抽出します。 | SELECT url_extract_fragment(concat('https://www.example.com:', a, '080/products/shirt?color=red&size=XL#discount-section')) FROM public.presto_test; | discount-section |
url_extract_host(varchar) → varchar | URL からホストを抽出します。 | SELECT url_extract_host(concat('https://www.example.com:', a, '080/products/shirt?color=red&size=XL#discount-section')) FROM public.presto_test; | www.example.com |
url_extract_parameter(varchar, varchar) → varchar | 指定された名前の最初のクエリパラメーターの値を抽出します。 | SELECT url_extract_parameter(concat('https://www.example.com:', a, '080/products/shirt?color=red&size=XL#discount-section'), 'color') FROM public.presto_test; | red |
url_extract_path(varchar) → varchar | URL からパスを抽出します。 | SELECT url_extract_path(concat('https://www.example.com:', a, '080/products/shirt?color=red&size=XL#discount-section')) FROM public.presto_test; | /products/shirt |
url_extract_port(varchar) → bigint | URL からポート番号を抽出します。 | SELECT url_extract_port(concat('https://www.example.com:', a, '080/products/shirt?color=red&size=XL#discount-section')) FROM public.presto_test; | 3088 |
url_extract_protocol(varchar) → varchar | URL からプロトコルを抽出します。 | SELECT url_extract_protocol(concat('https://www.example.com:', a, '080/products/shirt?color=red&size=XL#discount-section')) FROM public.presto_test; | https |
url_extract_query(varchar) → varchar | URL からクエリ文字列を抽出します。 | SELECT url_extract_query(concat('https://www.example.com:', a, '080/products/shirt?color=red&size=XL#discount-section')) FROM public.presto_test; | color=red&size=XL |