当前位置: 首页 > 面试题库 >

如何仅检索从Cassandra更改的信息?

韦鸣
2023-03-14
问题内容

我正在为下面的用例设计Cassandra列族模式。.我不确定为下面的用例设计cassandra列族的最佳方法是什么?我将为此使用CQL Datastax
Java驱动程序。

以下是我的用例和我现在设计的示例架构-

SCHEMA_ID       RECORD_NAME               SCHEMA_VALUE              TIMESTAMP
1                  ABC                     some value                 t1
2                  ABC                     some_other_value           t2
3                  DEF                     some value again           t3
4                  DEF                     some other value           t4
5                  GHI                     some new value             t5
6                  IOP                     some values again          t6

现在我将从上表中看到的是这样的-

  1. 每当我的应用程序运行时,我都会第一次要求上表中的所有内容。这意味着要给我上表中的所有内容。
  2. 然后每隔5或10分钟,我的后台线程就会检查该表,并要求给我仅更改过的所有内容(如果该行有任何更改,则整行显示)。所以这就是我将时间戳记用作一个原因的原因该列的..

但是我不确定如何设计查询模式以使我的两个用例都容易得到满足,为此设计表的正确方法是什么?在这里SCHEMA_ID将是我正在考虑使用的主键…

我将为此使用CQL和Datastax Java驱动程序。

更新:-

如果我使用的是这种方法,那么这种方法有什么问题吗?

CREATE TABLE TEST (SCHEMA_ID TEXT, RECORD_NAME TEXT, SCHEMA_VALUE TEXT, LAST_MODIFIED_DATE TIMESTAMP, PRIMARY KEY (ID));

INSERT INTO TEST (SCHEMA_ID, RECORD_NAME, SCHEMA_VALUE, LAST_MODIFIED_DATE) VALUES ('1', 't26',  'SOME_VALUE', 1382655211694);

因为,在我的用例中,我不希望任何人SCHEMA_ID每次SCHEMA_ID都插入相同的内容..
每当我们向该表中插入任何新行时都应该是唯一的。.因此,对于您的示例(@omnibear),可能有人可以两次插入相同的SCHEMA_ID?我对么?

此外,关于type您已被视为额外的一列,record_name在我的示例中,该类型的列也可以。


问题答案:

关于1)Cassandra用于大量写入,多个节点上的大量数据。从这种设置中检索所有数据是大胆的,因为这可能涉及必须由一个客户端处理的大量数据。更好的方法是
使用分页 。2.0本身支持此功能。

关于2)关键是分区键仅支持EQ或IN查询。对于LT或GT(),请使用列键。因此,如果有必要按“类型”之类的ID对条目进行分组,则可以将其用作分区键,并使用timeuuid作为列键。这样可以查询比X更新的所有条目

create table test 
  (type int, SCHEMA_ID int, RECORD_NAME text, 
  SCHEMA_VALUE text, TIMESTAMP timeuuid, 
  primary key (type, timestamp));

select * from test where type IN (0,1,2,3) and timestamp < 58e0a7d7-eebc-11d8-9669-0800200c9a66;

更新:

你问:

有人可以两次插入相同的SCHEMA_ID?我对么?

是的,您始终可以使用现有的主键进行插入。该主键上的值将被更新。因此,为了保持唯一性,通常在主键(例如timeuuid)中使用UUID。它是一个唯一值,包含时间戳记和客户端的MAC地址。有关此主题的文档非常出色。

一般建议:

  1. 首先写下您的查询,然后设计模型。 (用例!)
  2. 您的查询定义了数据模型,而数据模型又主要由 主键 定义

因此,在您的情况下,我只是在上面修改我的架构,如下所示:

CREATE TABLE TEST (SCHEMA_ID TEXT, RECORD_NAME TEXT, SCHEMA_VALUE TEXT,   
LAST_MODIFIED_DATE TIMEUUID, PRIMARY KEY (RECORD_NAME, LAST_MODIFIED_DATE));

允许此查询:

select * from test where RECORD_NAME IN ("componentA","componentB")
  and LAST_MODIFIED_DATE < 1688f180-4141-11e3-aa6e-0800200c9a66;

the uuid corresponds to -> Wednesday, October 30, 2013 8:55:55 AM GMT
so you would fetch everything after that


 类似资料:
  • 类似Bigtable的数据库存储按其键排序的行。 Cassandra使用分区和聚类键的结合来保持数据的分布和排序;但是,您只能通过使用分区键来选择行! 用于上述查询的Cassandra存储层的可视化。

  • 问题内容: 抱歉,没有描述的标题。我们继续进行编辑。 我有一张桌子: 每天都有一个条目,但是费率很少变化。我可以编写一个仅返回发生汇率变化的行的SQL查询吗?我正在使用SQLServer 问题答案: 如果我没看错,您不是要查找经过修改的行,而是要查找价格比前一天有所变化的行。此查询或类似的查询应该执行以下操作:

  • 是否有一种方法可以使我在从索引中检索时,只获得文档的_source中的数据&而不是任何其他元数据,如_index、_type、_id和_score?

  • 我收到以下JSON作为响应 我正在解析这个JSON,如下所示 这很好用。 我的问题是,如果JSON中缺少任何一个键,例如“名称”丢失,它就会断裂,我将无法定义 是否可以检查是否存在,然后重试? https://jsfiddle.net/o2gxgz9r/9078/ 关于我修改了json的答案 但是他自己的财产不起作用了? 请看这把小提琴 https://jsfiddle.net/o2gxgz9r/

  • 我有一个web应用程序,它使用JSF中的数据表和Primefaces特性,以便它可以执行一些更动态的功能。在dataTable中,我有包含可编辑数据的行。我的最终目标是让用户能够编辑数据,单击save按钮,update语句将被执行以替换数据库中存在的内容。问题是,此时我不知道如何检测ArrayList中对象的更改。 我已经杀一儆百,看看有没有人能解决我的困境。听我说,我有一个代码制作了一个data

  • 我制作了一个应用程序来教自闭症儿童学习交流。此应用程序适用于有限用户,因此用户需要向管理员注册才能使用该应用程序。 用户将他们的生物数据,如姓名、机构和“disetujui”发送到Firebase数据库。 应用程序发送“disetujui”默认值为0的信息。 管理员接受数据后,管理员将值“disetujui”设置为1,这样用户就可以登录应用程序。 现在,对于应用程序中的登录,我无法让应用程序知道值