我无法在网上找到这个。如何在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中注册一个类吗?
答案 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。