如何合并雪花中两个不同表的变体列数据
How to merge variant column data from two different tables in snowflake
我有两个 table 大约有数千列 each.Table 包含变体数据 columns.I 想根据变体数据中的键值合并变体数据列。
例如:
Table 1
专栏名称:SRC
值:{col1:val1,col2:val2,col3:val3}
Table 2:
专栏名称:SRC
值:{col1:val1,col2:val2,col4:val4}
我想要合并后的输出:
Table 1 :
SRC = {col1:val1,col2:val2,col3:val3,col4:val4}
我希望更新变体列中的现有键并在 table 中插入新键。
我已经用 object_insert()
方法尝试过,但它一次只能更新一个字段,并且很难在语法上实现数千个 columns.How 来实现多个字段。
谁能帮我解决这个问题?
如果您事先知道键,并且变体是对象,那么这会起作用:
with
a as ( select 1 id, parse_json('{"col1":"val1","col2":"val2","col3":"val3"}')::variant src),
b as ( select 1 id, parse_json('{"col1":"val1","col2":"val2","col4":"val4"}')::variant src)
select
object_construct(
'col1', coalesce(b.src:col1,a.src:col1),
'col2', coalesce(b.src:col2,a.src:col2),
'col3', coalesce(b.src:col3,a.src:col3),
'col4', coalesce(b.src:col4,a.src:col4)
) as src
from a left join b on a.id=b.id;
输出为:
SRC
-----------------
{ "col1": "val1", "col2": "val2", "col3": "val3", "col4": "val4" }
如果您事先不知道键,您可以展平对象,连接键,合并 () 值,然后使用 object_agg() 到 assemble 组合对象。
希望对您有所帮助
您可以使用 Javascript UDF 来执行此操作。这是一个简单的示例,您可以在此基础上进行非常简单的浅合并:
-- Create an example table
create or replace transient table test_table (column1 VARIANT, column2 VARIANT);
-- Insert some sample data
INSERT OVERWRITE INTO test_table (column1, column2)
select PARSE_JSON('{"a": "row1_val_a", "c": "row1_val_c"}'), PARSE_JSON('{"b": "row1_val_b"}')
union all
select PARSE_JSON('{"a": "row2_val_a", "b": "row2_val_b"}'), PARSE_JSON('{"c": "row2_val_c"}')
;
-- Have a look at the table
select * from test_table;
-- Create the javascript UDF that merges the two columns
CREATE OR REPLACE FUNCTION merge_json(OBJ_1 VARIANT, OBJ_2 VARIANT)
RETURNS variant
LANGUAGE JAVASCRIPT
AS
$$
function extend(obj, src) {
for (var key in src) {
if (src.hasOwnProperty(key)) obj[key] = src[key];
}
return obj;
}
return extend(OBJ_1, OBJ_2)
$$;
-- Use the UDF in a SQL query
select merge_json(column1, column2) from test_table;
此示例假定 VARIANT
个对象在同一 table 中,只是在不同的列中。您可以更改它以很容易地从不同的 table 中获取变体。
我有两个 table 大约有数千列 each.Table 包含变体数据 columns.I 想根据变体数据中的键值合并变体数据列。
例如:
Table 1 专栏名称:SRC 值:{col1:val1,col2:val2,col3:val3}
Table 2: 专栏名称:SRC 值:{col1:val1,col2:val2,col4:val4}
我想要合并后的输出: Table 1 : SRC = {col1:val1,col2:val2,col3:val3,col4:val4}
我希望更新变体列中的现有键并在 table 中插入新键。
我已经用 object_insert()
方法尝试过,但它一次只能更新一个字段,并且很难在语法上实现数千个 columns.How 来实现多个字段。
谁能帮我解决这个问题?
如果您事先知道键,并且变体是对象,那么这会起作用:
with
a as ( select 1 id, parse_json('{"col1":"val1","col2":"val2","col3":"val3"}')::variant src),
b as ( select 1 id, parse_json('{"col1":"val1","col2":"val2","col4":"val4"}')::variant src)
select
object_construct(
'col1', coalesce(b.src:col1,a.src:col1),
'col2', coalesce(b.src:col2,a.src:col2),
'col3', coalesce(b.src:col3,a.src:col3),
'col4', coalesce(b.src:col4,a.src:col4)
) as src
from a left join b on a.id=b.id;
输出为:
SRC
-----------------
{ "col1": "val1", "col2": "val2", "col3": "val3", "col4": "val4" }
如果您事先不知道键,您可以展平对象,连接键,合并 () 值,然后使用 object_agg() 到 assemble 组合对象。
希望对您有所帮助
您可以使用 Javascript UDF 来执行此操作。这是一个简单的示例,您可以在此基础上进行非常简单的浅合并:
-- Create an example table
create or replace transient table test_table (column1 VARIANT, column2 VARIANT);
-- Insert some sample data
INSERT OVERWRITE INTO test_table (column1, column2)
select PARSE_JSON('{"a": "row1_val_a", "c": "row1_val_c"}'), PARSE_JSON('{"b": "row1_val_b"}')
union all
select PARSE_JSON('{"a": "row2_val_a", "b": "row2_val_b"}'), PARSE_JSON('{"c": "row2_val_c"}')
;
-- Have a look at the table
select * from test_table;
-- Create the javascript UDF that merges the two columns
CREATE OR REPLACE FUNCTION merge_json(OBJ_1 VARIANT, OBJ_2 VARIANT)
RETURNS variant
LANGUAGE JAVASCRIPT
AS
$$
function extend(obj, src) {
for (var key in src) {
if (src.hasOwnProperty(key)) obj[key] = src[key];
}
return obj;
}
return extend(OBJ_1, OBJ_2)
$$;
-- Use the UDF in a SQL query
select merge_json(column1, column2) from test_table;
此示例假定 VARIANT
个对象在同一 table 中,只是在不同的列中。您可以更改它以很容易地从不同的 table 中获取变体。