配置单元转义符(\\)导致不匹配的令牌异常错误

时间:2018-11-06 18:42:14

标签: hive escaping hiveql

我有一个配置单元字段,其中的数据以这种格式存储。

co_mx
["2.00","7570180962446"]
[3,"7566180246570"]
[6,"7577182138618"]
[10.00,"7573181367421"]
[10,"7573181433469"]

我想提取列表中的第二个元素,即较大的数字字符串。

当我在Hive cli终端中运行代码时,我只使用了两个转义符(\),并且可以正常工作,但是我发现当使用hive -e运行代码时,我必须使用4个转义符,但是代码的粗体部分,即case语句的then部分引起了一些我无法调试的问题。

select 
cast(
trim(case 
when instr(split(split(co_mx,'\\\\,')[1],'\\\\]')[0],'\\\\"')>0 then 
     **split(split(split(co_mx,'\\\\,')[1],'\\\\]')[0],'\\\\"')[1]**
else split(split(co_mx,'\\\\,')[1],'\\\\]')[0] 
end)
as string) as id
from input_table

感谢帮助

1 个答案:

答案 0 :(得分:1)

您不需要屏蔽,。这应该可以正常工作:split(co_mx,',')

在许多情况下,您可以使用[]来进行如下屏蔽:'[\"]'-这里的转义符是在shell中使用的。在这种情况下,一次转义就足以用于外壳。 您可以像这样"来转义'[\"]'并使用rlike而不是instr

您的句子被重写:

select 
cast(
trim(case 
         when MyStr rlike '[\"]' then split(MyStr,'[\"]')[1]
         else MyStr 
     end)
as string) as id
from (select s.*, 
             split(split(co_mx,',')[1],'[]]')[0] MyStr 
       from input_table s
     ) s