有一段 Hive sql 代码,通过 shell hive cli 执行,有一段涉及转义字符大代码,大致如下:
hive -v -e "select lpad(split(app_version, '\\.')[1], 5, '0')"
本义是想通过字符 . 去做 split,但是这样写是错的,正确的写法如下:
hive -v -e "select lpad(split(app_version, '\\\\.')[1], 5, '0')"
我们解析下这段代码:
1.通过 shell 执行,shell 本身会转义一次,通过以下代码测试
echo "split(app_version, '\\.')"
输出:
split(app_version, '\.')
2.shell 输出给 hive cli,hive split 接收到'\.'
经过转义后就是 .
问题在于 split 参数接受的是 正则表达式,.
在正则是一个特殊字符,表示任意字符,如果想传字符. 就必须再转一次,也就是'\\.'
总结一下:
通过 Shell 包装的 hive shell sql 代码,在使用 split 这类函数的时候,对转移字符需要做两次转义,也就是:\\\\.
通过 beeline 或者 jdbc 调用的只需要 一次转义就行 '\\.'
网友评论