我有一个使用cassandra作为数据库的应用程序。表中的行由三个单独的时刻(三个输入)填充,我在该表中有四个主键,这些主键在插入或更新时始终不可用。
错误是:
Some partition key parts are missing' when trying to insert or update.
请考虑我的应用程序在很短的时间间隔内必须向数据库写入大量(接近300000次)数据,因此我想考虑数据库中可用的最大写入量。
也许这是一个标准可以解决这个问题,“首先从数据库中读取,然后写入数据库,如果在插入或更新时不可用,则使用伪值作为主键”。但这将发生更多关于数据库中另一个300000次读取的副本的活动,这将减慢数据库和我的应用程序的整个进程。所以我在寻找另一个解决方案。
1条答案
按热度按时间toe950271#
该表中有四个主键,而这些主键在插入或更新时始终不可用。
正如你所发现的,这是不可能的。特别是对于分区键,它们被用来(散列)确定集群中的哪个节点主要负责数据。由于它是Cassandra写入路径的基本部分,因此它必须在写入时完成,以后不能更改/更新。
集群键(决定分区内所有数据在磁盘上排序顺序的键)也是如此。省略一个或多个将产生以下消息:
不幸的是,没有一个好的方法来解决这个问题。一行的键必须在写入之前都知道。值得一提的是,Cassandra中的密钥是唯一的,因此任何更新它们的尝试都会导致新的一行。
也许事先将数据写入流主题或消息代理(如Pulsar或Kafka)会是一个更好的选择?然后,一旦知道了所有密钥,就可以从主题中消耗数据(消息)并将其写入Cassandra。