如何更新雪花中的半结构化数据?

时间:2020-03-06 10:27:32

标签: json snowflake-cloud-data-platform

我们在雪花列内的json对象中存储了大量的值/对。 值/对的数量未预先定义(因此为半结构化数据)

更新值对之一有什么选择?

我应该提取整个JSON,将其转换为字符串,修改字符串并完全更新对象列吗?

还是有一个不错的小功能,我可以只更新想要的一对?

create or replace table TB as
select $1 TB_ID, parse_json($2) my_json
from values
(1, '{ "FruitShape":"Round", "FruitSize":55 } '),
(2, '{ "FruitShape":"Square"  } '),
(3, '{ "FruitShape":"Oblong", "FruitSize":22, "FruitColor":"Chartreuse" })
;

这创建了3行,每行最多3个值/对。

假设我想将第一行的属性从“圆形”更改为“正方形”

UPDATE TB
  SET my_json = parse_json('{ "FruitShape":"square", "FruitSize":55 }')
  WHERE TB_ID = 1;

这是我应该做的吗?

2 个答案:

答案 0 :(得分:0)

您不应该尝试更新,只需添加新行,然后使用视图访问当前值即可。

答案 1 :(得分:0)

您可以使用javascript UDF来实现。例如:

create or replace function merge_objects("a" object, "b" object)
returns object
language javascript
as
$$ 
    return {...a, ...b} 
$$;

然后这样呼叫:

select merge_objects(
  object_construct('a',1,'b',2), 
  object_construct('b',3,'c',4)
);

select merge_objects(
  parse_json('{"a":1,"b":[1,2,3]}')::object, 
  parse_json('{"c":2,"b":[2,3,4]}')::object
);