【问题标题】:Hive escape characters (\\) are causing Mismatched token exception errorHive 转义字符 (\\) 导致不匹配的令牌异常错误
【发布时间】:2019-09-14 02:53:52
【问题描述】:

我有一个蜂巢字段,其中数据以这种格式存储。

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

感谢帮助

【问题讨论】:

  • 相关列的数据类型是什么?

标签: hive escaping hiveql


【解决方案1】:

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

在许多情况下,您可以使用[] 进行如下屏蔽:'[\"]' - 此处的转义用于在 shell 中使用。在这种情况下,对于 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

【讨论】:

    猜你喜欢
    • 2018-07-29
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2017-10-24
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多