是的,您在 PlayOrm 中需要这样的东西......(如果我遗漏任何内容,请发表评论,我可以再次回复)。
https://github.com/deanhiller/playorm/blob/master/src/test/java/com/alvazan/test/db/PartitionedTrade.java
还有查询 PARTITIONS t('account', :partId) SELECT t FROM TABLE as t INNER JOIN t.security as s WHERE s.securityType = :type and t.numShares = :shares"
'account' 标识分区列, :partId 是分区的 id。在您的情况下,您将有 PARTITIONS t('deviceid', {actualDeviceId}) 或 t('time', {time}) 其中第一个参数是列名,第二个是分区的实际 id 时间或设备分区的 ID。实现分区的行数不应超过 X 百万行,其中 X 可能约为 300 万行。
com.alvazan.test.db 包有大量不同的示例,com.alvazan.test 显示了它们的使用方式。我将要求某人根据您的反馈调整文档,以将链接直接链接到我们代码库中的代码......
附言。如果您从 github 下载,运行 gradlew eclipse 或 gradle eclipse(取决于操作系统),然后导入到 eclipse 中,所有测试都可以使用内存中的 noSQL 版本进行开箱即用(我们将其用于开发)。然后,如果您想针对 cassandra 运行,则在文档中它有如何更改一行并且所有测试都针对 cassandra 运行。
加速。PlayOrm 使用复合名称模式为每个分区(每个分区的索引)执行宽行。当您查询时,它以 200 个批次(或您提供的大小)读取这一行,然后使用索引中找到的键向所有机器发送请求(即此时您获得并行吞吐量)。这是因为每个分区都分布在集群中。事实上,所有节点最终都会得到几乎所有分区的切片,具体取决于您拥有多少节点和多少分区(即 100 个节点和 32 个分区,并非所有节点都具有所有分区)。
在幕后,playorm 正在做一些非常非常简单的事情。所有行都被写入,就好像它们根本没有分区一样!!!然后写入索引行(RF=3 表示到 3 个节点),索引行名称为 /TABLE/partition/column/partitionId。那是索引的行键。使用命令行工具,您甚至可以自己读取索引,只读取索引或查询分区。为此,请使用 playOrm 的命令行工具。
最后,由于 cassandra 中的宽行是有序的,因此当您使用特定索引(例如 PARTITIONS d('deviceid', 'device1') select d from TABLE as d where d.time > Integer.MIN_INT
然后结果按该索引的顺序返回(即在这种情况下为时间),或者如果您想要相反的顺序,只需调用 cursor.afterLast 然后 cursor.previous、cursor.previous 等等等。
需要明确的是,PlayOrm 在这里故意忽略了 cassandra 分区。它写入您的数据,就像根本没有分区一样。它还写入一个或两个索引。假设您分区两次,一次按时间,一次按设备 ID。在这种情况下,它使用行键(并说您的实体称为设备)写入 StringIndice 或 IntegerIndice 表(BigInteger !!!不是 Integer)。假设在您的实体中,您在“名称”列上有 @NoSqlIndexed!!!!
/Devices/byDevice/device1/name = the wide row
/Devices/byTime/time56/name = the wide row
如果您有更多 @NoSqlIndexed 列,则索引表中有更多行。然而,所有行都分布在集群中,并且不关心分区。
这有意义吗?随意尝试一下。如果您对实现它有任何问题/疑问,只需在 stackoverflow 上发布一个新问题。