Java 源代码编译失败 - Cassandra 函数
Java source compilation failed - Cassandra Function
我是 Cassandra 的新手,我正在尝试创建一个用户定义的聚合,但卡在了函数创建过程中。
table 中的数据是 -
count| host
-----+-----------
102 | test_host1
100 | test_host2
101 | test_host2
101 | test_host3
104 | test_host3
101 | test_host1
100 | test_host3
103 | test_host3
102 | test_host3
100 | test_host1
我正在编写的函数将计算我的 table 中有多少行与特定主机。如果我向聚合提供 test_host1,理想的结果将是 3.
找到下面函数的代码 -
CREATE FUNCTION countSessions(dataMap map<text,int>,host text)
RETURNS NULL ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java as
'
Integer countValue = dataMap.get(host);
if(countValue == null) {
countValue = 1;
} else {
countValue++;
}
dataMap.put(host,countValue);
return dataMap;
';
在 cqlsh 上执行此操作时,出现以下错误 -
InvalidRequest: code=2200 [Invalid query] message="Could not compile function 'visitors.countsessions' from Java source: org.apache.cassandra.exceptions.InvalidReq
uestException: Java source compilation failed:
Line 2: dataMap cannot be resolved
Line 7: dataMap cannot be resolved
Line 8: dataMap cannot be resolved to a variable
"
我无法理解我的函数代码有什么问题。请帮忙。
另外,有人可以向我推荐任何 link/site(datastax 除外),我可以使用它来正确理解 UDF 和 UDA。
感谢和问候,
维巴夫
PS - 如果有人选择否决这个问题,请在评论中说明原因。
这不起作用,因为 dataMap
在初始声明中被转换为小写。你可以这样做:
CREATE FUNCTION countSessions("dataMap" map<text,int>,host text)
RETURNS NULL ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java as
'
Integer countValue = dataMap.get(host);
if(countValue == null) {
countValue = 1;
} else {
countValue++;
}
dataMap.put(host,countValue);
return dataMap;
';
或
CREATE FUNCTION countSessions(datamap map<text,int>,host text)
RETURNS NULL ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java as
'
Integer countValue = datamap.get(host);
if(countValue == null) {
countValue = 1;
} else {
countValue++;
}
datamap.put(host,countValue);
return datamap;
';
使这项工作成功。
我是 Cassandra 的新手,我正在尝试创建一个用户定义的聚合,但卡在了函数创建过程中。
table 中的数据是 -
count| host
-----+-----------
102 | test_host1
100 | test_host2
101 | test_host2
101 | test_host3
104 | test_host3
101 | test_host1
100 | test_host3
103 | test_host3
102 | test_host3
100 | test_host1
我正在编写的函数将计算我的 table 中有多少行与特定主机。如果我向聚合提供 test_host1,理想的结果将是 3.
找到下面函数的代码 -
CREATE FUNCTION countSessions(dataMap map<text,int>,host text)
RETURNS NULL ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java as
'
Integer countValue = dataMap.get(host);
if(countValue == null) {
countValue = 1;
} else {
countValue++;
}
dataMap.put(host,countValue);
return dataMap;
';
在 cqlsh 上执行此操作时,出现以下错误 -
InvalidRequest: code=2200 [Invalid query] message="Could not compile function 'visitors.countsessions' from Java source: org.apache.cassandra.exceptions.InvalidReq uestException: Java source compilation failed: Line 2: dataMap cannot be resolved Line 7: dataMap cannot be resolved Line 8: dataMap cannot be resolved to a variable "
我无法理解我的函数代码有什么问题。请帮忙。
另外,有人可以向我推荐任何 link/site(datastax 除外),我可以使用它来正确理解 UDF 和 UDA。
感谢和问候,
维巴夫
PS - 如果有人选择否决这个问题,请在评论中说明原因。
这不起作用,因为 dataMap
在初始声明中被转换为小写。你可以这样做:
CREATE FUNCTION countSessions("dataMap" map<text,int>,host text)
RETURNS NULL ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java as
'
Integer countValue = dataMap.get(host);
if(countValue == null) {
countValue = 1;
} else {
countValue++;
}
dataMap.put(host,countValue);
return dataMap;
';
或
CREATE FUNCTION countSessions(datamap map<text,int>,host text)
RETURNS NULL ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java as
'
Integer countValue = datamap.get(host);
if(countValue == null) {
countValue = 1;
} else {
countValue++;
}
datamap.put(host,countValue);
return datamap;
';
使这项工作成功。