如何使用自定义Java类在Cassandra中创建用户定义的函数?

时间:2017-04-27 15:20:38

标签: cassandra cassandra-2.0 cassandra-2.1

我无法在网上找到这个。如何在cassandra中创建自定义用户定义函数?。

对于Ex:

CREATE OR REPLACE FUNCTION customfunc(custommap map<text, int>)
CALLED ON NULL INPUT
RETURNS map<int,bigint> 
LANGUAGE java AS 'return MyClass.mymethod(custommap);';

Where&#34; MyClass&#34;我可以在Classpath中注册一个类吗?

3 个答案:

答案 0 :(得分:1)

在尝试构建外部类方法以支持类似的东西时,只需将2美分添加到此线程中。在使用Datastax Sandbox 5.1尝试了几个小时后,我无法使用它,因为它似乎无法找到我的类并且不断引发类型错误。

我的猜测是不支持基于JAR的外部UDF代码(请参阅http://koff.io/posts/hll-in-cassandra/https://issues.apache.org/jira/browse/CASSANDRA-9892)。支持“TRUSTED”JAR正处于Cassandra 4的规划阶段。它可能适用于3.0之前的早期版本,但我使用的是Datastax的最新版本。

要解决此问题,我不得不回避使用Javascript版本(我试图将JSON字符串转换为Map对象)。

虽然我意识到Java UDF表现更好,但我测试的代码仍然使用Java Nashorn javascript支持,因此使用Javascript可能不是一件坏事。它最终会得到一个更简单的单行UDF。

答案 1 :(得分:0)

<强> 1。首先构建包含您的类的Java项目。请记住,您必须在课程中添加包名称。

示例:

package exp;

import java.lang.Math;
import java.util.*;

public class MyClass
{
  public static Map<Integer,Long> mymethod(Map<String, Integer> data) {
      Map<Integer,Long> map = new HashMap<>();
      map.put(1, 10L);
      map.put(2, 20L);
      map.put(3, 30L);
      return map;
  }
}

编译和构建后,我有jar test.jar

<强> 2。将jar文件复制到所有cassandra节点的$CASSANDRA_HOME/lib目录

第3。重新启动所有Cassandra节点

<强> 4。创建自定义功能

示例:

 CREATE OR REPLACE FUNCTION customfunc(custommap map<text, int>) 
    CALLED ON NULL INPUT 
    RETURNS map<int,bigint>  
    LANGUAGE java 
    AS 'return exp.MyClass.mymethod(custommap);';

现在你可以使用这个功能:

cassandra@cqlsh:test> SELECT * FROM test_fun ;

 id | data
----+------------------
  1 | {'a': 1, 'b': 2}

(1 rows)
cassandra@cqlsh:test> SELECT customfunc(data) FROM test_fun ;

 test.customfunc(data)
-----------------------
 {1: 10, 2: 20, 3: 30}

(1 rows)

答案 2 :(得分:0)

我也有同样的问题。 UDF中的自定义类在 cassandra 2.2.14 中受支持,但在 cassandra 3.11.4 中不受支持。

遍历源代码 cassandra 3.11.4 ,在没有父类加载器的情况下设置UDF类加载器,以便它可以完全控制UDF使用的类/资源。在org.apache.cassandra.cql3.functions.UDFunction.java中,白名单和黑名单用于控制可以访问的类/包。

对于您的问题,您应该将MyClass的全名添加到白名单中,然后重新构建cassandra。