如何为范围查询编写 Aerospike 流 UDF

Posted

技术标签:

【中文标题】如何为范围查询编写 Aerospike 流 UDF【英文标题】:How to write an Aerospike stream UDF for a range Query 【发布时间】:2017-04-12 15:26:51 【问题描述】:

我为范围查询编写了一个 Stream UDF,但它不能正常工作。你知道如何用 lua 设置许多过滤器吗?

查询:

SELECT id1, id2, link_type, visibility, data, time, version FROM linktable
WHERE id1 = <id1> AND
  link_type = <link_type> AND
  time >= <minTime> AND
  time <= <maxTimestamp> AND
  visibility = VISIBILITY_DEFAULT
ORDER BY time DESC LIMIT <offset>, <limit>;

调用这个lua函数的Java代码:

stmt = new Statement();
stmt.setNamespace(dbid);
stmt.setSetName("links");
stmt.setIndexName("time");
stmt.setFilters(Filter.range("time", minTimestamp, maxTimestamp));
stmt.setAggregateFunction("linkbench", "check_id1", Value.get(id1));
stmt.setAggregateFunction("linkbench", "check_linktype", Value.get(link_type));
resultSet = client.queryAggregate(null, stmt, "linkbench", "check_visibility", Value.get(VISIBILITY_DEFAULT));

Lua 脚本:

local function map_links(record)
    -- Add user and password to returned map.
    -- Could add other record bins here as well.
    return record.id2
end

function check_id1(stream,id1)
    local function filter_id1(record)
        return record.id1 == id1
    end
    return stream : filter(filter_id1) : map(map_links)
end

function check_linktype(stream,link_type)
    local function filter_linktype(record)
        return record.link_type == link_type
    end
    return stream : filter(filter_linktype) : map(map_links)
end

function check_visibility(stream,visibility)
    local function filter_visibility(record)
        return record.visibility == visibility
    end
    return stream : filter(filter_visibility) : map(map_links)
end

知道如何为所有查询限制编写过滤器吗?

谢谢!

【问题讨论】:

同时也在讨论:discuss.aerospike.com/t/… 【参考方案1】:

由于release 3.12 和predicate filter 是正确的方法,因此完全避免使用Lua 以获得更好的性能和可扩展性。

查看 Java 客户端的 PredExp 类及其用于构建复杂过滤器的 examples。 C、C# 和 Go 客户端当前也存在谓词过滤。

【讨论】:

请注意,您不能在服务器端执行 ORDER BY 。您必须在应用程序端捕获与谓词过滤器匹配的记录并在那里进行排序。 太棒了。我几乎浪费了几天时间来弄清楚如何在 Aerospike 中组合多个过滤器。现在看起来一切正常。非常感谢【参考方案2】:

不支持多个聚合函数。聚合和过滤功能必须结合使用。

function combined_aggregation(stream,id1,link_type,visibility)
    local function combined_filter(record)
        return record.id1 == id1 and 
               record.link_type == link_type and
               record.visibility == visibility
    end
    return stream : filter(combined_filter) : map(map_links)
end

【讨论】:

以上是关于如何为范围查询编写 Aerospike 流 UDF的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Google BigQuery 转义 JavaScript UDF 中的字符?

如何将 Array[Long] id 传递到 Aerospike Record UDF?

如何为具有泛型类型的箭头函数编写流类型

如何为 Network.framework 编写 NWProtocolFramer,使用分隔符将流拆分为帧?

Excel UDF 接受范围和数组作为参数,如“SUM”

如何为所有会话创建配置单元 UDF