LoginSignup
2
0

More than 5 years have passed since last update.

Verticaのユーザー定義関数をR言語で実装する

Last updated at Posted at 2017-12-14

概要

VerticaのUDF(ユーザー定義関数)を、R言語で実装する方法メモ。
62進数を10進数に変換する関数を実装します。

関連記事

関数を作成

decode_decimal62がメインの関数で、decode_decimal62FactoryというFactoryという関数で、メインの関数の設定をする必要があるみたい。

/home/user/decode_decimal62.r
# メインの、62進数を10進数に変換する関数
decode_decimal62 <- function(x, y) {
    # 変換対象62進数
    str <- as.character(x[,1])
    str_list <- unlist(strsplit(str, split = ""))
    # base62
    chars=c(0:9, letters, LETTERS)
    # length = 62
    base <- length(chars)

    # optional parameter
    version <- ifelse(!is.null(y[['version']]), as.character(y[['version']]), '')
    if (version > 1) {
        num <- 0
        for (char in str_list) {
            num <- num * base + which(chars == char) - 1
        }
        num
    } else {
        as.integer(str)
    }
}

# optional paramters
decode_decimal62Parameters <- function() {
    params <- data.frame(
                         datatype=rep(NA, 1),
                         length=rep(NA,1),
                         scale=rep(NA,1),
                         name=rep(NA,1)
    )
    # y[['version']]で取り出す
    params[1,1] = "int"
    params[1,4] = "version"
    params
}

# メインの関数の設定をする関数
decode_decimal62Factory <- function() {
    list ( name = decode_decimal62,
           # scalarかtransformを選択する。
           udxtype = c("scalar"),
           # メインの関数の引数の型。複数ある場合はカンマ区切りで指定
           intype = c("varchar"),
           # 戻り値の型
           outtype = c("int"),
           # 実際にSQLで使用するときの関数名を指定
           outnames = c("udfDecodeDecimal62"),
           # optional paramters
           parametertypecallback = decode_decimal62Parameters
         )
}

Create

関数を登録します。

LIBRARY DecodeDecimal62Libの部分は、任意のライブラリ名を付ける。
FUNCTION udfDecodeDecimal62の部分は、RScriptのdecode_decimal62Factory関数のoutnamesで指定した名前を付ける。

CREATE OR REPLACE LIBRARY DecodeDecimal62Lib AS '/home/user/decode_decimal62.r' LANGUAGE 'R';
CREATE OR REPLACE FUNCTION udfDecodeDecimal62 AS LANGUAGE 'R' NAME 'decode_decimal62Factory' LIBRARY DecodeDecimal62Lib;

実行

引数に62進数を入れて実行すると、10進数になって返ってきました。

オプション引数あり

vertica=> select udfDecodeDecimal62('3d7' USING PARAMETERS version = 2);
-[ RECORD 1 ]------+------
udfDecodeDecimal62 | 12345

オプション引数なし

vertica=> select udfDecodeDecimal62('54321');
-[ RECORD 1 ]------+------
udfDecodeDecimal62 | 54321

以上

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0