如何合并雪​​花中两个不同表的变量列数据

时间:2019-12-04 13:11:04

标签: json merge snowflake-data-warehouse variant

我有两个表,每个表约有数千列。该表包含变体数据列。我想根据变体数据中的键值合并变体数据列。

例如:

表1 列名称:SRC 值:{col1:va​​l1,col2:val2,col3:val3}

表2: 列名称:SRC 值:{col1:va​​l1,col2:val2,col4:val4}

合并后我想要输出: 表格1 : SRC = {col1:va​​l1,col2:val2,col3:val3,col4:val4}

我想更新变量列中的现有键,并在表中插入新键。

我已经使用object_insert()方法进行了尝试,但是它一次只能更新一个字段,并且很难在语法上实现数千列。如何使用多个字段来实现这一点。 有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

如果您事先知道键,并且变体是对象,那么它将起作用:

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()组装组合的对象。

希望有帮助

答案 1 :(得分:1)

您可以使用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对象在同一表中只是在单独的列中。您可以对其进行更改,以很容易地从不同的表中获取Variants。