Presto Insert Overwrite使用ESCAPE报错,咨询支持性及解决方案
Presto INSERT OVERWRITE中SELECT语句的ESCAPE语法支持问题及解决办法
核心结论
先给你明确答案:Presto的LIKE表达式不支持ESCAPE语法,你遇到的报错和INSERT OVERWRITE本身无关——这个写入语法是完全正常的,问题出在SELECT子句里的LIKE语句不符合Presto的语法规范。
错误原因分析
你写的语句片段:
case when col1 like '%\_ppc%' ESCAPE '\' then 'AA' else 'BB' end
Presto的SQL解析器无法识别ESCAPE关键字,因为它的LIKE语法默认就将反斜杠\作为转义字符,不需要显式声明ESCAPE子句。这也是报错提示missing KW_THEN at 'ESCAPE'的原因——解析器把ESCAPE当成了语法错误的多余内容,找不到应该紧跟在LIKE条件后的THEN关键字。
解决建议
根据你的需求,有两种可行的修改方案:
方案一:移除ESCAPE子句(最直接)
既然Presto默认用反斜杠转义,你原本的%\_ppc%写法已经能正确匹配包含_ppc的字符串(\_用来转义下划线,避免它作为LIKE的通配符匹配任意单个字符)。修改后的完整语句如下:
CREATE external TABLE tgt ( `traffic_source` String ) stored as orc LOCATION 's3://bucket/folder/orc/'; insert overwrite table tgt select case when col1 like '%\_ppc%' then 'AA' else 'BB' end as traffic_source from src;
方案二:使用regexp_like函数实现自定义转义(更灵活)
如果你需要使用非反斜杠的转义字符,或者需要更复杂的匹配逻辑,可以用Presto支持的regexp_like正则匹配函数。比如你想用#作为转义字符,写法如下:
insert overwrite table tgt select case when regexp_like(col1, '%#_ppc%', 'escape=#') then 'AA' else 'BB' end as traffic_source from src;
另外,正则表达式里的下划线_本身不是通配符,所以如果只是简单匹配包含_ppc的字符串,也可以直接写:
insert overwrite table tgt select case when regexp_like(col1, '.*_ppc.*') then 'AA' else 'BB' end as traffic_source from src;
内容的提问来源于stack exchange,提问作者yasemin
相关产品推荐
相关产品推荐

