Snowflake SQL结合JavaScript实现多正则规则循环数据清洗方案咨询
问题说明
我现有如下查询语句:
Select COLUMN as RAW_COLUMN ,REGEX_REPLACE(COLUMN,'REGEX_PATTERN_HERE','REPLACEMENT_STRING_HERE') as CLEAN_COLUMN FROM TABLE
如上所示,我已创建了基于JavaScript的REGEX_REPLACE自定义函数,支持通过正则模式替换列值,函数定义如下:
CREATE OR REPLACE FUNCTION "REGEX_REPLACE"("SUBJECT" VARCHAR(16777216), "PATTERN" VARCHAR(16777216), "REPLACEMENT" VARCHAR(16777216)) RETURNS VARCHAR(16777216) LANGUAGE JAVASCRIPT AS ' const p = SUBJECT; let regex = new RegExp(PATTERN, ''i'') return p.replace(regex, REPLACEMENT); ';
我需要通过多轮正则替换完成数据清洗,目标是定义存储正则匹配模式与替换字符串的字典,循环遍历字典执行REGEX_REPLACE函数,即需在SQL查询内部遍历完整字典,重复执行REGEX_REPLACE函数直到所有规则应用完成。
// 规则格式:regex_pattern_dict={'匹配模式':'替换内容'} regex_pattern_dict ={ '[0-9]{2}[\/\.][0-9]{2}':'' // 移除日期格式如 "08/02" ,'[0-9]{3}[-][0-9]{3}[-][0-9]{4}':'' // 移除手机号格式如 "888-957-4675" ,'[+][0-9]{11}': '' // 移除手机号格式如 "+18882467822" };
换言之,我希望在SQL查询内部使用JavaScript的REGEX_REPLACE函数与上述字典实现循环逻辑,期望实现效果如下:
Select COLUMN as RAW_COLUMN --,REGEX_REPLACE(COLUMN,'REGEX_PATTERN_HERE','REPLACEMENT_STRING_HERE') as CLEAN_COLUMN ,for (const [PATTERN, REPLACEMENT] of Object.entries(regex_pattern_dict)) { REGEX_REPLACE(COLUMN,PATTERN,REPLACEMENT); } AS CLEAN_COLUMN FROM TABLE
目前我不清楚如何在SQL中嵌入JavaScript循环逻辑,请问该如何实现该需求?
实现方案
在@David Garrison的帮助下,得到了如下可行解决方案:
CREATE or replace PROCEDURE TABLE_CLEAN() RETURNS VARCHAR LANGUAGE javascript AS $$ // 正则清洗规则字典 const regex_pattern_dict ={ "[0-9]{2}[\/\.][0-9]{2}":"" // 移除日期格式如 "08/02" ,"[0-9]{3}[-][0-9]{3}[-][0-9]{4}":"" // 移除手机号格式如 "888-957-4675" ,"[+][0-9]{11}": "" // 移除手机号格式如 "+18882467822" }; // 待清洗的字段名 var RegexStr = "COLUMN"; // 遍历规则拼接嵌套替换逻辑,Key为正则匹配模式,Value为替换字符串 for (const [key, value] of Object.entries(regex_pattern_dict)) { RegexStr = "REGEX_REPLACE(" + RegexStr + ",'" + key + "','" + value + "')" } var rs = snowflake.execute( { sqlText: ` CREATE OR REPLACE VIEW DATABASE.SCHEMA.TABLE AS SELECT COLUMN , ${RegexStr} as clean_column FROM DATABASE.SCHEMA.TABLE_ORIGINAL ` } ); $$; -- 执行存储过程生成清洗视图 call TABLE_CLEAN(); -- 查询清洗后的结果 select * from DATABASE.SCHEMA.TABLE
内容的提问来源于stack exchange,提问作者mikelowry
相关产品推荐
相关产品推荐

