如何用Hive HQL清洗特殊格式列?解决regexp_replace报错问题
嘿,咱们先把你碰到的报错根源搞清楚:
Error: Error while compiling statement: FAILED: SemanticException [Error 10014]: Line 53:1 Wrong arguments '''': No matching method for class org.apache.hadoop.hive.ql.udf.UDFRegExpReplace with (array
, string, string). Possible choices: FUNC(string, string, string)
这个报错说得很直白:regexp_replace函数的第一个参数必须是字符串类型,但你传的s_agr.sig_tecnologia是array<string>(数组类型),参数类型不匹配,所以才触发了语义错误。
接下来分两种情况给你针对性的解决方案:
情况1:你的列确实是array<string>类型
如果这个列本身就是Hive的数组类型(比如存储的是["A","B","C"]这样的数组对象,而非字符串格式的数组),那完全没必要用正则替换,直接用Hive内置的concat_ws函数就能一步到位,效率还更高:
select concat_ws(',', s_agr.sig_tecnologia) as formatted_result from your_table_name;
concat_ws的作用就是用你指定的分隔符(这里是逗号)把数组里的所有元素拼接成一个字符串,正好符合你的需求,输出就是A,B,C、ABC,RFG,ERD,BAC这种格式。
情况2:你的列是字符串类型(存的是类似"[\"A\",\"B\",\"C\"]"的文本)
如果这个列实际是字符串类型,只是内容长得像数组,那你需要先确保传入regexp_replace的是字符串,同时调整正则表达式(你原来的正则转义写法有问题):
select regexp_replace(s_agr.sig_tecnologia, '\\[|\\]|"', '') as formatted_result from your_table_name;
这里的正则会匹配并替换掉左括号[、右括号]和双引号",替换成空字符串后,就能得到你想要的逗号分隔结果。
最后给个小建议:先用desc your_table_name;查看一下列的实际类型,选对应的方法就好——处理数组的话,concat_ws肯定是比正则替换更靠谱的选择。
内容的提问来源于stack exchange,提问作者Henrique Branco

