如何:在不使用 map 的情况下编写 Aerospike 的 UDF 过滤器或者在 map 中返回完整的记录
我有一个在 Aerospike 中使用过滤器和 map 的 UDF 流。
如果我使用 map,按照所有我看到的示例,我可以从记录中选择字段并返回一张新的经过筛选和选定的字段的 map。然而,我不想那么做。我想要什么样的流,什么样的列/仓,应用过滤器并返回完整的记录。一种方法可能是使用类似于 stream : filter(my_filter) 的东西而不使用 map。从直觉上来说(至少对我来说),这只会过滤和中继流。这似乎不起作用,让我非常沮丧。接下来我尝试使用 map,但只是中继完整的记录。这也不起作用。在两种情况下,当我说它不起作用时,我得到一个空列表作为我的结果。
可否有人友好地解释一下这应该如何工作?这让我非常疯狂。 鉴于这是世界上最基本的使用 UDF 的事情之一,我意识到我错过了一些明显的东西。我应该指出,我做过很多更复杂的 UDF 工作,但不知为何,对我来说这是个问题。
在Aerospike中,记录是元组(_key_、 _metadata_、 _bins_)。无论是记录UDF还是流UDF,使用Lua编写的Aerospike UDF只能返回以下支持的类型之一:字符串、整数、双精度浮点数、列表、映射、字节(请参见:已知限制)。
在流UDF中,如果只有筛选器,则仍需要将记录的bin名称/ bin-value对转换为映射,并返回该映射:
`` ` local function bins_match_filter(bin1,bin2) 返回函数(rec) 如果rec [bin1]和rec [bin2]均存在且 (类型(rec [bin1])==类型(rec [bin2]))且 rec [bin1] ==rec [bin2]然后 返回真 结束 返回false end end
local function record_to_map(rec) local ret = map() for i,bin_name in ipairs(record.bin_names(rec))do ret [bin_name] = rec [bin_name] end 返回ret end
function check_bins_match(stream,bin1,bin2) 返回stream:filter(bins_match_filter(bin1,bin2)):map(record_to_map) end `` `
您可以将某些基于流UDF的筛选器转换为predicate筛选器表达式。它无法用于上面的示例,因为没有办法比较两个bin的值。但是对于大多数情况,谓词表达式操作是足够的(请参见Java客户端的PredExp类)。您不需要调用UDF,这将运行速度更快,扩展性更好,而且不需要将记录转换为bin名称/值对的映射。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你所忽略的是UDF返回值中不能返回记录或流类型。我相信所有返回类型都由aerospike系统lua模块映射到特定于客户端的类型;它不能映射回记录“类型”。
如果你绝对想要获取记录,可以在bin中存储你的键,将该bin返回为map类型、string类型或integer类型 - 不管哪种类型最适合你的应用程序。你也可以在map类型中返回记录元数据中的记录摘要。我没有测试通过UDF检索和返回记录摘要,但值得一试。
一旦你有了命名空间、集合和你的键,或者命名空间和记录摘要,你就可以从客户端API中访问记录。记录摘要是从集合名称和你的键的组合计算出来的RIPEMD160哈希值。