CREATE FUNCTION

ユーザー指定のコードを実行するためのカスタム関数を作成します。

cassandra.yaml

cassandra.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/cassandra.yaml
tarボール・インストール installation_location/resources/cassandra/conf/cassandra.yaml

SELECTUPDATEINSERTに含まれるユーザー指定のJavaまたはJavascriptコードを実行するか、ユーザー定義集計に対してビルディング・ブロックを指定します。関数は、それらが作成されたキースペース内でのみ使用できます。

UDFは、Javaジェネリック・メソッドまたはJavascriptをユーザー指定のコードブロックでサポートします。UDFは、選択したプログラミング言語で発生する可能性のある標準的なあらゆる問題に対して脆弱です。Nullポインター例外、無効な引数、その他の潜在的な問題の原因などの例外に対する対策を講じることが重要です。関数の実行時に例外が発生すると、文全体が失敗します。
注: デフォルトでは、データベースでUDFを使用できません。有効にするには、次の設定をcassandra.yaml で変更し、すべてのノードを再起動します。

構文

CREATE [ OR REPLACE ] FUNCTION [ IF NOT EXISTS ] [keyspace_name.]function_name (argument_list [ , ... ])
  ( CALLED | RETURNS NULL ) ON NULL INPUT RETURNS type 
  [ DETERMINISTIC ]
  [ MONOTONIC [ ON argument_name ] ]
  LANGUAGE ( java | javascript ) AS $$ code_block $$ ;
1. 凡例
構文規則 説明
大文字 リテラル・キーワード。
小文字 リテラル以外。
イタリック体 変数値。ユーザー定義値と置き換えます。
[] 任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。
( ) グループ。丸かっこ(( ))は、選択肢を含むグループを示します。丸かっこは入力しないでください。
| または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。
... 繰り返し可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。
'Literal string' 単一引用符( ' )でCQL文内のリテラル文字を囲みます。大文字を維持するには、単一引用符を使用します。
{ key : value } マップ・コレクション。中かっこ( { } )でマップ・コレクションまたはキーと値のペアを囲みます。コロンでキーと値を区切ります。
<datatype1,datatype2> セット、リスト、マップ、またはタプル。山かっこ(< >)で、セット、リスト、マップまたはタプル内のデータ型を囲みます。データ型はコンマで区切ります。
cql_statement; CQL文の終了。セミコロン( ; )ですべてのCQL文を終了します。
[--] コマンドライン・オプションとコマンド引数は、2つのハイフン(--)。この構文は、引数がコマンドライン・オプションと間違われる可能性がある場合に役立ちます。
' <schema> ... </schema> ' 検索CQLのみ:単一引用符( ' )でXMLスキーマ宣言全体を囲みます。
@xml_entity='xml_entity_type' 検索CQLのみ:スキーマ・ファイルおよびsolrConfigファイル内のXML要素を上書きするための実体とリテラル値を示します。
function_name
キースペース修飾関数名を指定します。名前は文字または数字で始まる必要があります。大文字と小文字の区別を維持する場合は、名前を二重引用符で囲みます。
OR REPLACE
同じ名前の関数が既に存在する場合、その関数を上書きします。
注: IF NOT EXISTSオプションとともに使用することはできません。
IF NOT EXISTS
同じ名前の関数が既に存在する場合に処理を実行せず、エラー・メッセージを抑制します。
argument_list
処理のためにコード・ブロックにデータ型が渡された引数のコンマ区切りリスト。
arg_name cql_type [,...]

リストでは、引き数名、CQLデータ型の順に指定します。

要求に対しては、対応するデータ型のカラムまたは手動で入力された(リテラル)カラムから引数値が読み取られます。

CALLED ON NULL INPUT
入力値がNullである場合や欠落している場合も、ユーザー指定のコード・ブロックを実行します。
RETURNS NULL ON NULL INPUT
ユーザー指定のコード・ブロックをNull値に対して実行せず、Nullを返します。
RETURNS cql_data_type
コード・ブロックからの出力期待値を互換性のあるCQLデータ型にマップします。
DETERMINISTIC
特定の入力に対して常に同じ出力を返す関数について指定します。たとえば、toJson()は確定的な関数ですが、now()およびcurrentDate()は決定的な関数ではありません。

デフォルト:false(非確定的)。

注: GROUP BYは、確定的で、単調な関数のみをサポートしています。
MONOTONIC [ ON argument_name ]
すべての引数または指定された引数は、全体的に非増加または非減少の場合、単調です。
注: GROUP BYは、確定的で、単調な関数のみをサポートしています。
LANGUAGE language_name
サポートされている型はjavaまたはjavascriptです。
ヒント: enable_scripted_user_defined_functionsがfalseで、enable_user_defined_functionsがtrueの場合、Javaがサポートされている唯一の言語となります。
code_block' | $$ code_block $$

コード・ブロックは単一引用符で囲むか、コード・ブロックに特殊文字が含まれている場合は二重ドル記号($$)で囲みます。コードは関数としてラップされ、ターゲット変数に適用されます。

Javaを使用してFLOG関数を作成する

入力値の対数を計算するfLog関数を上書きするか、作成します。CALLED ON NULL INPUTによって、関数が常に実行されることが保証されます。
CREATE OR REPLACE FUNCTION cycling.fLog (
  input double
) 
  CALLED ON NULL INPUT 
  RETURNS double 
  LANGUAGE java AS 
    $$
      return Double.valueOf(Math.log(input.doubleValue()));
    $$ 
;

Javascriptを使用してSQLに似たLEFT関数を作成する

JavaScriptのテキスト・フィールドから最初のN文字を返す関数を作成します。RETURNS NULL ON NULL INPUTによって、入力値がNullの場合に関数が実行されないことが保証されます。
CREATE OR REPLACE FUNCTION cycling.left (
  column text, num int
) 
  RETURNS NULL ON NULL INPUT 
  RETURNS text 
  LANGUAGE javascript AS 
    $$
      column.substring(0, num)
    $$
;
要求で関数を使用します。
SELECT left(firstname, 1), lastname
FROM cycling.cyclist_name;
 cycling.left(firstname, 1) | lastname
----------------------------+-----------------
                          A |           FRAME
                       null |        MATTHEWS
                       null |             VOS
                          P |       TIRALONGO
                          M |             VOS
                          S |      KRUIKSWIJK
                          A | VAN DER BREGGEN