如何:在不使用 map 的情况下编写 Aerospike 的 UDF 过滤器或者在 map 中返回完整的记录

我有一个在 Aerospike 中使用过滤器和 map 的 UDF 流。

如果我使用 map,按照所有我看到的示例,我可以从记录中选择字段并返回一张新的经过筛选和选定的字段的 map。然而,我不想那么做。我想要什么样的流,什么样的列/仓,应用过滤器并返回完整的记录。一种方法可能是使用类似于 stream : filter(my_filter) 的东西而不使用 map。从直觉上来说(至少对我来说),这只会过滤和中继流。这似乎不起作用,让我非常沮丧。接下来我尝试使用 map,但只是中继完整的记录。这也不起作用。在两种情况下,当我说它不起作用时,我得到一个空列表作为我的结果。

可否有人友好地解释一下这应该如何工作?这让我非常疯狂。 鉴于这是世界上最基本的使用 UDF 的事情之一,我意识到我错过了一些明显的东西。我应该指出,我做过很多更复杂的 UDF 工作,但不知为何,对我来说这是个问题。

点赞
用户1917187
用户1917187

你所忽略的是UDF返回值中不能返回记录或流类型。我相信所有返回类型都由aerospike系统lua模块映射到特定于客户端的类型;它不能映射回记录“类型”。

如果你绝对想要获取记录,可以在bin中存储你的键,将该bin返回为map类型、string类型或integer类型 - 不管哪种类型最适合你的应用程序。你也可以在map类型中返回记录元数据中的记录摘要。我没有测试通过UDF检索和返回记录摘要,但值得一试。

一旦你有了命名空间、集合和你的键,或者命名空间和记录摘要,你就可以从客户端API中访问记录。记录摘要是从集合名称和你的键的组合计算出来的RIPEMD160哈希值。

2017-06-18 16:30:05
用户582436
用户582436

在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名称/值对的映射。

2017-07-15 00:36:57