Экранирующие символы куста (\\) вызывают ошибку исключения несоответствующего токена - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть поле улья, в котором хранятся данные в этом формате.

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

Я хочу извлечь второй элемент в списке, то есть строку чисел большего размера.

Когда я запускаю код в терминале Hive cli, я использую только два управляющих символа (\), и это работает, но я обнаружил, что при использовании hive -e для запуска кода мне нужно использовать 4 управляющих символа, но жирную часть кода, т.е. then часть оператора case вызывает некоторые проблемы, которые я не могу отладить.

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 голосов
/ 06 ноября 2018

Вам не нужно экранировать ,. Это должно работать нормально: split(co_mx,',')

Во многих случаях вы можете использовать [] для экранирования, например: '[\"]' - здесь используется escape для использования в оболочке. В этом случае для снаряда достаточно одного выхода. Вы можете экранировать " вот так '[\"]' и использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...