从Aerospike查询语言的集合中选择随机bin



我想从命名空间中的一个集合中选择一个随机'n'bin的样本。有没有一种方法可以在Aerospike查询语言中实现这一点?

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

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

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

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

行就像Aerospike中的记录,列就像bin。你没有办法从表中随机抽取列,是吗?

您可以使用添加到集合扫描中的ScanPolicy.maxRecords从集合中随机采样记录。请注意,Aerospike版本5.6中的新(可选(集合索引可能会加速该操作。

每个名称空间都将其数据划分为4096个逻辑分区,并且名称空间中的记录使用20字节RIPEMD-160摘要的特性均匀地分布到每个分区。因此,Aerospike没有rownum,但您可以利用数据分布对数据进行采样。

每个分区大约占命名空间的0.0244%。这是一个可以使用的示例空间,类似于上面的SQL查询。接下来,如果您使用客户端的ScanParition方法,您可以给它ScanPolicy.maxRecords来从该分区中挑选特定数量的记录。此外,如果您愿意,您可以在任意摘要(请参阅PartitionFilter.after(之后开始。

好的,现在我们来谈谈数据浏览。您可以使用Aerospike JDBC驱动程序,而不是使用aql工具,它可以与任何JDBC兼容的数据浏览器(如DBeaver、SQuirreL和Tableau(配合使用。当您在SELECT语句中使用LIMIT时,它基本上会执行我上面描述的操作——在该扫描中使用分区扫描和最大记录样本。我建议你试试这个替代方案。

AQL是一个使用Aerospike C客户端编写的工具。Aerospike没有服务器能够理解的类似SQL的查询语言本身。AQL提供的任何功能都有文档记录-在AQL>提示。

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

相关内容

  • 没有找到相关文章