Cassandra:如何从多个表中读取数据

Cassandra:如何从多个表中读取数据,cassandra,hector,Cassandra,Hector,我正在使用hector访问java中的cassandra。我有四个表:用户、评论、用户喜欢、用户推荐。user_like和user_Recommension表有一个计数器列。现在,我想根据用户id一起访问所有四个表中的数据。我该怎么做?我应该从所有表中分别获取给定的userId数据,还是有办法一次获取它?不幸的是,查询绑定到列族。因此,每个列族都需要一个查询 如果您想在一个阅读中阅读所有内容,请考虑将所有内容放在一个列族中,或者更好地放在一行中 我会这样做: 现在你有: CF“评论” “user

我正在使用hector访问java中的cassandra。我有四个表:用户、评论、用户喜欢、用户推荐。user_like和user_Recommension表有一个计数器列。现在,我想根据用户id一起访问所有四个表中的数据。我该怎么做?我应该从所有表中分别获取给定的userId数据,还是有办法一次获取它?

不幸的是,查询绑定到列族。因此,每个列族都需要一个查询

如果您想在一个阅读中阅读所有内容,请考虑将所有内容放在一个列族中,或者更好地放在一行中

我会这样做:

现在你有: CF“评论”
“user1”=>//行
列“名称1”=“值1”//column

CF“用户喜欢” “user1”=>//行 列“名称2”=“值2”//column

CF“用户推荐”
“user1”=>//行
列“name3”=“value3”//column

这需要3个查询,因为您有3个列族

一个列族中的所有内容都是: CF“用户”
“user1_comments”=>//行
…列“名称1”=“值1”//column
“user1_likes”=>//行
…列“名称2”=“值2”//column
“user1\u建议”=>//行
…列“name3”=“value3”//column

这是更好的方式,但仍然次优。您可以通过multi_-get查询获取所有信息。这些查询速度较慢,因为它们可能需要等待集群中的许多节点返回(如果它们非常相似,则不同的键可能落在不同的节点事件中)

最佳:所有东西都排在一行。 CF“用户”
“user1”=>//行
…列“注释:名称1”=“值1”//column
…列“likes:name2”=“value2”//column
…列“建议:名称3”=“值3”//column

您可以通过一行读取所有内容。如果您只想单独获取评论、喜欢或推荐,可以使用范围查询。因为所有内容都在一行中,所以您的查询速度会快得多。卡桑德拉可以很好地处理非常宽的行,所以你不必担心这些

对cassy来说,一个很好的发展哲学是“如果你一起阅读(同时),然后一起保存(在同一位置)”

编辑:不使用计数器进行计数器操作的技巧。 卡桑德拉一直非常擅长编写新的价值观(事实上,这是它在后台所做的100%)。加上一行或该行范围内的列计数速度相当快。所以我想出了一种“计数器”的方法,可以用来防止重复计数。注意:这只适用于单位增量(+1…liks-likes、upvots等)

您只需在代表该计数器的行中写入一个新列: 如果要允许重复,请将列名设置为timeUuid或时间戳。Otherwize将其作为他喜欢的消息的id(这样,如果他两次单击like,则仍将其视为一个like)

现在有两种解决方案:使用java.util.Collection.size()触发多个查询来计算列数,或者在一次读取中读取所有内容并进行计数

此解决方案确实使用了cassandra的优点,但可能不适合所有人,尤其是如果您希望避免非常宽的行。知道Cassandra可以处理非常宽的行,但在应用程序中用于计数的集合可能会出现内存问题

你可能会得到这样的结果:

CF“用户”
“用户1”=>
…列“注释:名称1”=“值1”
…列“注释:名称2”=“值2”
…列“likes:43f54880-a0fb-11e2-aafa-f1dce92b7e5b”=“1”//此处的时间uuid
…列“likes:43f54881-a0fb-11e2-aafa-f1dce92b7e5b”=“1”
…列“likes:43f54882-a0fb-11e2-aafa-f1dce92b7e5b”=“1”
…列“likes:43f54883-a0fb-11e2-aafa-f1dce92b7e5b”=“1”
…列“推荐:7ba30e15-2b76-4aaa-b2d0-f8419a80a769”=“1”//uuid推荐项目

…列“建议:603879cc-d7b0-4767-ad27-e5dd4aa34f62”=“1”

不幸的是,查询绑定到列族。因此,每个列族都需要一个查询

如果您想在一个阅读中阅读所有内容,请考虑将所有内容放在一个列族中,或者更好地放在一行中

我会这样做:

现在你有: CF“评论”
“user1”=>//行
列“名称1”=“值1”//column

CF“用户喜欢” “user1”=>//行 列“名称2”=“值2”//column

CF“用户推荐”
“user1”=>//行
列“name3”=“value3”//column

这需要3个查询,因为您有3个列族

一个列族中的所有内容都是: CF“用户”
“user1_comments”=>//行
…列“名称1”=“值1”//column
“user1_likes”=>//行
…列“名称2”=“值2”//column
“user1\u建议”=>//行
…列“name3”=“value3”//column

这是更好的方式,但仍然次优。您可以通过multi_-get查询获取所有信息。这些查询速度较慢,因为它们可能需要等待集群中的许多节点返回(如果它们非常相似,则不同的键可能落在不同的节点事件中)

最佳:所有东西都排在一行。 CF“用户”
“user1”=>//行
…列“注释:名称1”=“值1”//column
…列“likes:name2”=“value2”//column
…列“建议:名称3”=“值3”//column

您可以通过一行读取所有内容。如果您只想单独获取评论、喜欢或推荐,可以使用范围查询。因为所有内容都在一行中,所以您的查询速度会快得多。卡桑德拉可以很好地处理非常宽的行,所以你不必担心这些

对cassy来说,一个很好的发展哲学是“如果你一起阅读(同时),然后一起保存(在同一位置)”

编辑:不使用计数器进行计数器操作的技巧。 卡桑德拉一直非常擅长编写新的价值观(事实上,这是它在后台所做的100%)。加上计数c