我得到" Java编译失败:无法解析为数据类型"当试图在cassandra 3.11版本中运行该函数时。我编译了我的类并在cassandra lib目录中部署了jar。请问有人可以提供帮助吗?如果cassandra 3.11兼容执行UDF的外部基于JAR的代码,请告诉我。
## package getMap;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
public class RollAgent {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, Integer> data = new HashMap<String, Integer>();
data.put("abcd", 2);
Map<String, Integer> returndata = RollAgent.grpagents(data);
System.out.println(returndata);
}
private static Logger LOGGER = Logger.getLogger("string");
public static Map<String, Integer> grpagents(Map<String, Integer> data) {
LOGGER.info("Steppin into agent rollups");
Map<String, Integer> map = new HashMap<>();
map.put("1", 10);
map.put("2", 20);
map.put("3", 30);
return map;
}
}
cassandra UDF:-
CREATE OR REPLACE FUNCTION
glowroot1.grpagentNtracetallydur(state map<text, int>)
CALLED ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java
as 'return getMap.RollAgent.grpagents(state);';
##
答案 0 :(得分:0)
如果你使用Cassandra 2.2或更高版本,你应该可以创建自己的方法,虽然我发现了一些关于3的开放性问题:here是一个例子,UDF适用于2.2但不适用于3.10
我会仔细检查:
cassandra.yaml,默认情况下,在配置中禁用用户定义的函数 - 设置enable_user_defined_functions = true以启用它。
将jar文件复制到$ CASSANDRA_HOME / lib目录后,重新启动cassandra节点。
同样基于documentation我会修改UDF:
CREATE OR REPLACE FUNCTION
glowroot1.grpagentNtracetallydur(state map<text, int>)
CALLED ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java
as $$return getMap.RollAgent.grpagents(state);$$;
答案 1 :(得分:0)
对于3.10作品:
但是您不能对Logger.getLogger使用getClassLoader,或者您需要修补ThreadAwareSecurityManager.java(注释super.checkPermission(perm))
public void checkPermission(Permission perm)
{
if (!isSecuredThread())
return;
// required by JavaDriver 2.2.0-rc3 and 3.0.0-a2 or newer
// code in com.datastax.driver.core.CodecUtils uses Guava stuff, which in turns requires this permission
if (CHECK_MEMBER_ACCESS_PERMISSION.equals(perm))
return;
return; //super.checkPermission(perm);
}