首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PlayORM中的基本分区

PlayORM中的基本分区
EN

Stack Overflow用户
提问于 2013-03-21 13:51:34
回答 1查看 219关注 0票数 0

假设我在cassandra中有一个CF,它具有以下模式:

  • TimeStamp
  • 设备ID
  • 设备名称
  • 设备所有者

PKEY ( TimeStamp,设备ID):这意味着分区正在发生在TimeStamp上。

以下是我感兴趣的问题:

从时间戳=‘..’的模式中选择*从DeviceID='..‘的模式中选择*

第一个查询返回500 K记录,第二个查询返回50K记录。对于第一个查询,瓶颈是在单个节点上全部获取数据,因此我希望为一个TimeStamp在多个节点上分发数据。第二个查询的瓶颈是所有记录都可能分布在不同节点上的磁盘上,从而导致多个磁盘获取。

现在假设我希望创建虚拟分区,以便特定TimeStamp的条目也分布在集群节点上。这在PlayORM中是可能的吗?如果是,请您提供可以这样做的代码(或做这种事情的示例)吗?

我的另一项要求是搜索所有记录以获得特定的设备ID。我是否可以对同一CF在“设备ID”上进行虚拟分区?如果是,请提供代码/链接来说明如何做?

如果有人能为这样的事情提供源代码,我会很高兴的,因为文档并不是那么容易理解,仅仅通过阅读当前的文档来编写代码就成了一场噩梦。如果没有完整的代码示例,评估PlayORM似乎是不可能的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 15:27:26

是的,在PlayOrm中你需要这样的东西.(如果我遗漏了什么,我可以再次回复)。

https://github.com/deanhiller/playorm/blob/master/src/test/java/com/alvazan/test/db/PartitionedTrade.java

此外,查询分区t('account',:partId)从表中选择t作为t内连接,t.security作为s,其中s.securityType = :type和t.numShares =:share“

“‘account”标识分区列,并且:partId是分区的id。在您的情况下,您将有分区t('deviceid',{actualDeviceId})或t(' time ',{time}),其中第一个param是列名,第二个是分区的实际id (时间),或者是设备分区的id。实现分区不应超过X百万行,其中X可能在300万左右。

包com.alvazan.test.db有大量不同的示例,com.alvazan.test展示了它们的使用方式。我要请某人根据你的反馈修改文档,把链接直接放到代码库中.

ps。如果您从github下载,运行gradlew eclipse或gradle eclipse(取决于操作系统),然后导入eclipse,所有测试都会以内存中的noSQL版本作为开箱即用(我们将其用于开发)。然后,如果您想对cassandra运行,在docs中,它需要如何更改一行,所有测试都运行在cassandra上。

加速。PlayOrm使用复合名称模式对每个分区执行宽行(每个分区的索引)。当您查询时,它会以200(或您所提供的大小)的批次读取此行,然后使用索引中的键向所有机器发送请求(即。在这一点上获得并行吞吐量)。这是因为每个分区都分布在集群中。实际上,所有节点最终都有几乎所有分区的片,这取决于您拥有多少个节点和有多少个分区(即。100个节点和32个分区,并不是所有节点都有所有分区)。

在幕后,播放是在做一些非常简单的事情。所有行都被写入,就好像它们根本没有被分区一样!然后编写索引行(RF=3表示为3个节点),索引行名为/TABLE/分区/列/partitionId。这是索引的行键。使用命令行工具,您甚至可以自己读取索引,只读取索引或查询分区。USe playOrm的命令行工具。

最后,由于cassandra中的宽行是有序的,所以当使用分区d('deviceid','device1')之类的特定索引时,从表中选择d作为d,其中d.time > Integer.MIN_INT

然后,结果按照那个指数的顺序(即。时间),或者如果你想要倒序,只需调用cursor.afterLast然后cursor.previous,cursor.previous等等。

明确地说,PlayOrm在这里故意忽略cassandra分区。它在数据中写入,就像根本没有分区一样。它也写在一两个索引中。假设您分区了两次,一次是按时间进行的,一次是通过设备id进行的。在这种情况下,它写到StringIndice或IntegerIndice表(BigInteger!而不是Integer)的行键(并说您的实体称为设备)。我们还可以说,在您的实体中,您在"name“列上有@NoSqlIndexed!

代码语言:javascript
复制
/Devices/byDevice/device1/name = the wide row
/Devices/byTime/time56/name = the wide row

如果有更多@NoSqlIndexed列,则索引表中有更多行。但是,所有行都分布在集群中,不关心分区。

这有道理吗?尽管试一试,试一试。如果您对实现堆栈溢出有任何问题/问题,只需在堆栈溢出上发布一个新问题即可。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15549432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档