Cassandra中的用户定义函数与自定义Java类抛出无法解决错误

时间:2018-05-23 12:58:03

标签: java cassandra

我得到" 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);';
  ##

2 个答案:

答案 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作品:

  1. 您可以将您的课程添加到 com.datastax.driver.core
  2. 包中
  3. 但是您不能对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);
    }