【问题标题】:Cassandra UDF with Java throwing error on usage of stream带有Java的Cassandra UDF在使用流时抛出错误
【发布时间】:2020-10-28 19:33:24
【问题描述】:

我正在尝试使用 Java 编写 UDF in Cassandra。 我有两个具有一对一映射的整数列表,即第一个列表中的第一项对应于第二个列表中的第一项。这就是我的数据存储在 Cassandra 表中两列列表类型下的方式。 我的UDF

CREATE OR REPLACE FUNCTION mykeyspace.get_thread(list1 List<int>, list2 List<int>)
CALLED ON NULL INPUT 
RETURNS List<int>
LANGUAGE java
AS '
Map<Integer, Integer> intermediatemap = new HashMap<Integer, Integer>();
for (int i = 0; i < list1.size(); i++) {
   if (!intermediatemap.containsKey(i))
       intermediatemap.put(list1.get(i), list2.get(i));
}
List<Integer> commentids = new ArrayList<Integer>();
intermediatemap.entrySet().stream()
       .sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed())
       .forEachOrdered(x -> commentids.add(x.getKey()));
if (commentids.size() > 8)
   return commentids.subList(0, 8);
else
   return commentids;
'; 

这一切都像代码一样运行良好。但是,当我在 cqlsh 上执行此操作时,我收到错误提示

InvalidRequest: Error from server: code=2200 [Invalid query] message="Java source compilation failed:
Line 8: The type java.util.stream.Stream cannot be resolved. It is indirectly referenced from required .class files
Line 8: The method stream() from the type Collection<Map.Entry<Integer,Integer>> refers to the missing type Stream

我使用的 Cassandra 版本有问题吗?我在 docker 内的本地 MAC 机器上运行 Cassandra。我尝试过使用3.11.2 和带有latest 标签的图像。 此外,UDF 功能已启用,我可以运行简单的 UDF 功能。

【问题讨论】:

    标签: cassandra user-defined-functions cqlsh


    【解决方案1】:

    您只能使用在 Cassandra 内允许的类列表中明确定义的类,而不是在定义的禁止列表中。如果你查看 Cassandra 3.11.2 的源代码,you can see that java.utils.stream is in the disallowed list,那么你不能在 UDF/UDA 中使用它。

    【讨论】:

    • 感谢您的回答。我已修改我的代码以不使用流。
    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多