如何在 snowflake 中使用 table 自动化字段映射
How to automate a field mapping using a table in snowflake
我的雪花数据库中有一列 table,其中包含一个 JSON 映射结构,如下所示
ColumnMappings : {"Field Mapping": "blank=Blank,E=East,N=North,"}
如何编写一个查询,如果我向 Field Mapping
提供 E
的值,我将得到 East
,或者如果 N
的值,我将得到 North
等等,无需像 CASE
语句提供的那样对查询中的值进行硬编码。
您真的想要这种 JSON 形式的映射:
{
"blank" : "Blank",
"E" : "East",
"N" : "North"
}
您可以在 Snowflake 中实现,例如使用简单的 JS UDF:
create or replace table x(cm variant) as
select parse_json(*) from values('{"fm": "blank=Blank,E=East,N=North,"}');
create or replace function mysplit(s string)
returns variant
language javascript
as $$
res = S
.split(",")
.reduce(
(acc,val) => {
var vals = val.split("=");
acc[vals[0]] = vals[1];
return acc;
},
{});
return res;
$$;
select cm:fm, mysplit(cm:fm) from x;
-------------------------------+--------------------+
CM:FM | MYSPLIT(CM:FM) |
-------------------------------+--------------------+
"blank=Blank,E=East,N=North," | { |
| "E": "East", |
| "N": "North", |
| "blank": "Blank" |
| } |
-------------------------------+--------------------+
然后您可以使用 GET 简单地按键提取值,例如
select cm:fm, get(mysplit(cm:fm), 'E') from x;
-------------------------------+--------------------------+
CM:FM | GET(MYSPLIT(CM:FM), 'E') |
-------------------------------+--------------------------+
"blank=Blank,E=East,N=North," | "East" |
-------------------------------+--------------------------+
为了提高性能,您可能需要确保在映射 table 中每个值仅调用一次 mysplit
,甚至 pre-materialize 它。
我的雪花数据库中有一列 table,其中包含一个 JSON 映射结构,如下所示
ColumnMappings : {"Field Mapping": "blank=Blank,E=East,N=North,"}
如何编写一个查询,如果我向 Field Mapping
提供 E
的值,我将得到 East
,或者如果 N
的值,我将得到 North
等等,无需像 CASE
语句提供的那样对查询中的值进行硬编码。
您真的想要这种 JSON 形式的映射:
{
"blank" : "Blank",
"E" : "East",
"N" : "North"
}
您可以在 Snowflake 中实现,例如使用简单的 JS UDF:
create or replace table x(cm variant) as
select parse_json(*) from values('{"fm": "blank=Blank,E=East,N=North,"}');
create or replace function mysplit(s string)
returns variant
language javascript
as $$
res = S
.split(",")
.reduce(
(acc,val) => {
var vals = val.split("=");
acc[vals[0]] = vals[1];
return acc;
},
{});
return res;
$$;
select cm:fm, mysplit(cm:fm) from x;
-------------------------------+--------------------+
CM:FM | MYSPLIT(CM:FM) |
-------------------------------+--------------------+
"blank=Blank,E=East,N=North," | { |
| "E": "East", |
| "N": "North", |
| "blank": "Blank" |
| } |
-------------------------------+--------------------+
然后您可以使用 GET 简单地按键提取值,例如
select cm:fm, get(mysplit(cm:fm), 'E') from x;
-------------------------------+--------------------------+
CM:FM | GET(MYSPLIT(CM:FM), 'E') |
-------------------------------+--------------------------+
"blank=Blank,E=East,N=North," | "East" |
-------------------------------+--------------------------+
为了提高性能,您可能需要确保在映射 table 中每个值仅调用一次 mysplit
,甚至 pre-materialize 它。