在cassandra中为用户定义的数据类型字段设置默认未设置值

vxbzzdmp  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(478)

我将嵌套的json值存储在cassandra中,因为我有很多字段,有没有办法为没有输入的字段保留未设置的值
假设我有一张像下面这样的table,

CREATE TYPE address (number int, street text, address2 text);

CREATE TABLE users (
    id int PRIMARY KEY,
            street_address frozen<address>
);

INSERT INTO users JSON '{"id": 5, "street_address": 
   {"number": 123, "street": "Main St."}}';

如果我运行上面的查询,下面是列值,

5   {number:123,street:'Main St.',address2:NULL}

我想忽略这个 address2:NULL 插入第2列。我也尝试过“默认未设置”,但它不起作用
我只是用这个表中的两个字段框起来,类似于我有多个带有嵌套json对象的字段。是否有避免空插入的解决方法

qhhrdooz

qhhrdooz1#

更新后回答问题(2019年10月15日更新:更新后的答案不正确,因为本例中存在复制粘贴错误(用户对用户2)!-看起来,当从json更新时,udt被完全替换了):
你用的是 frozen udt,并且它会立即更新(作为一个二进制对象),因此如果数据中缺少字段,那么它将表示为 null . 但如果你用的是非冷冻udt DEFAULT UNSET 按要求工作-缺少的字段不会覆盖现有值:

cqlsh:test> INSERT INTO users2 JSON '{"id": 5, "street_address": {"number": 123, 
    "street": "Main St.", "address2": "test" }}';
cqlsh:test> SELECT * from users2;

 id | street_address
----+-----------------------------------------------------
  5 | {number: 123, street: 'Main St.', address2: 'test'}

(1 rows)
cqlsh:test> INSERT INTO users JSON '{"id": 5, "street_address": {"number": 1234, 
    "street": "Main St.3"}}' DEFAULT UNSET ;
cqlsh:test> SELECT * from users2;

 id | street_address
----+-----------------------------------------------------
  5 | {number: 123, street: 'Main St.', address2: 'test'}

(1 rows)

答案的第一个变体:
默认情况下,json是用 DEFAULT NULL 指定选项-这意味着所有缺少的字段都替换为 null ,以便删除现有数据。如果要取消设置,则需要在json值之后指定相应的选项,如下所示:

INSERT INTO mytable JSON '{ "\"myKey\"": 0, "value": 0}' DEFAULT UNSET;

有关此主题的说明,请参阅cassandra文档。
p、 如果我没记错的话,这个选项可能并不存在于每个Cassandra版本中。

相关问题