我想从命名空间中的一个集合中选择一个随机'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选项之一。(