我想从命名空间中的集合中选择一个随机的“n”箱样本。有没有办法在 Aerospike 查询语言中实现这一点?
在 Oracle 中,我们通过以下查询实现了类似的功能:
SELECT * FROM <table-name> sample block(10) where rownum < 101
上述查询从 100 的样本大小中获取大小为 10 行的块。
我们也可以在 Aerospike 中做类似的事情吗?
我想从命名空间中的集合中选择一个随机的“n”箱样本。有没有办法在 Aerospike 查询语言中实现这一点?
在 Oracle 中,我们通过以下查询实现了类似的功能:
SELECT * FROM <table-name> sample block(10) where rownum < 101
上述查询从 100 的样本大小中获取大小为 10 行的块。
我们也可以在 Aerospike 中做类似的事情吗?
AQL 是使用 Aerospike C 客户端编写的工具。Aerospike 本身没有服务器可以理解的类似 SQL 的查询语言。AQL 提供的任何功能都已记录在案 - 在aql>提示符下键入 HELP。
您可以使用 C 或 Java 编写应用程序来实现此目的。例如,在 Java 中,您可以使用 ScanPolicy 中定义的 maxRecords 执行 scanAll() API 调用。我没有看到 AQL 工具为扫描提供该选项。(它只允许您指定扫描速率,其他 ScanPolicy 选项之一。)
行就像 Aerospike 中的记录,列就像垃圾箱。您没有办法从表中随机抽取列,是吗?
您可以使用添加到该集合的扫描从集合中抽取随机记录。请注意,Aerospike 5.6 版中ScanPolicy.maxRecords
的新(可选)集合索引可能会加速该操作。
每个命名空间将其数据划分为 4096 个逻辑分区,并且使用 20 字节 RIPEMD-160 摘要的特性将命名空间中的记录平均分配给每个逻辑分区。因此,Aerospike 没有rownum
,但您可以利用数据分布对数据进行采样。
每个分区大约占命名空间的 0.0244%。这是您可以使用的示例空间,类似于上面的 SQL 查询。接下来,如果您使用ScanParition
客户端的方法,您可以让它ScanPolicy.maxRecords
从该分区中选择特定数量的记录。PartitionFilter.after
此外,如果您愿意,还可以在任意摘要之后开始(请参阅 参考资料 )。
好的,现在让我们谈谈数据浏览。除了使用 aql 工具,您还可以使用Aerospike JDBC 驱动程序,该驱动程序可与任何 JDBC 兼容的数据浏览器(如 DBeaver、SQuirreL 和 Tableau)一起使用。当您LIMIT
在SELECT
语句上使用时,它基本上会执行我上面描述的操作 - 在该扫描中使用分区扫描和最大记录样本。我建议你试试这个作为替代方案。