【问题标题】:Frozen keyword in cassandracassandra中的冻结关键字
【发布时间】:2018-07-15 22:19:42
【问题描述】:

无论我在UDT中使用或不使用frozen关键字,它都在更新记录。

我有表用户:

CREATE TABLE demokeyspace.user (
    userid text PRIMARY KEY,
    address1 frozen<address>,
    password text,
    uname text
)

和地址类型:

CREATE TYPE demokeyspace.address (
    street text,
    city text,
    zip_code int
);

正在将 street:'updated street' 和 city 和 zip_code 更新为 null

根据 Cassandra,如果声明为 FROZEN,它不允许更新 UDT 值。

有人可以帮我吗?

【问题讨论】:

  • 我正在使用 [cqlsh 5.0.1 |卡桑德拉 3.11.2 | CQL 规范 3.4.4 |原生协议 v4]

标签: cassandra


【解决方案1】:

如果您使用未冻结的UDT,并且想更新一个字段,则可以使用以下(see docs):

update user set address1.street='updated street' where userid='2';

在您的情况下,您正在使用内部只有一个值的 UDT 更新完整的 address1 字段...

如果您使用冻结的 UDT,您必须在更新期间指定所有值,就像您现在正在做的那样,但提供所有值。

如果您总是更新完整记录,则鼓励使用冻结值,但如果您需要更新部分记录,则不应使用它。

【讨论】:

  • 感谢 Alex,只有一个问题,如果我有一个像 List 这样的 UDT 并且 order 有 20 列。这个 UDT 可以拥有的最大大小及其可行性?
  • 如果我理解正确,Order 是 UDT - 在这种情况下,它应该被冻结。 “冻结”值只是一组字节,因此总大小将是此 UDT 中所有字段的大小 + 表示类型的一些开销。关于list - 如果可能(值的顺序无关紧要等),那么最好使用set - 它在磁盘上有更好的表示。
  • 好吧,假设我每天有 1000 个订单,是否适合在 Cassandra 中将其定义为 UDT?
  • 对不起,可能我没有完全理解……UDT是用来表示复杂的数据结构的。订单一般都有,所以表示为UDT就可以了。在列表中存储订单 - 这是另一个问题。也许将每个订单表示为单独的行会更有效,但这实际上取决于您的访问模式......
  • frozen> 和 List> 是否相同?当我将列创建为 addressdetail freeze> 时,它会显示为 addressdetail freeze>> 。当我描述桌子时;
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2019-03-09
相关资源
最近更新 更多