3

我想从命名空间中的集合中选择一个随机的“n”箱样本。有没有办法在 Aerospike 查询语言中实现这一点?

在 Oracle 中,我们通过以下查询实现了类似的功能:

SELECT * FROM <table-name> sample block(10) where rownum < 101 

上述查询从 100 的样本大小中获取大小为 10 行的块。

我们也可以在 Aerospike 中做类似的事情吗?

4

2 回答 2

2

AQL 是使用 Aerospike C 客户端编写的工具。Aerospike 本身没有服务器可以理解的类似 SQL 的查询语言。AQL 提供的任何功能都已记录在案 - 在aql>提示符下键入 HELP。

您可以使用 C 或 Java 编写应用程序来实现此目的。例如,在 Java 中,您可以使用 ScanPolicy 中定义的 maxRecords 执行 scanAll() API 调用。我没有看到 AQL 工具为扫描提供该选项。(它只允许您指定扫描速率,其他 ScanPolicy 选项之一。)

于 2021-05-12T22:31:40.907 回答
2

行就像 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)一起使用。当您LIMITSELECT语句上使用时,它基本上会执行我上面描述的操作 - 在该扫描中使用分区扫描和最大记录样本。我建议你试试这个作为替代方案。

于 2021-05-22T00:28:55.720 回答