Экранирующий дочерний оператор в функции HIVE get_json_object

#sql #json #hive #special-characters #hiveql

Вопрос:

У меня есть таблица со строковым столбцом, который содержит данные в формате JSON. Затем я использую эту функцию get_json_object для анализа некоторых данных из нее. Проблема в том, что одно из моих полей содержит a . в своем имени. Таким образом, если написать имя поля обычным текстом, функция будет интерпретировать его как дочерний оператор.

Вот пример кода, который работает:

 select get_json_object(col, '$.rootkey')
from (select '{"rootkey":15,"key.a":16,"key.b":17}' as col) test;
 

Но это не удается:

 select get_json_object(col, '$.key.a')
from (select '{"rootkey":15,"key.a":16,"key.b":17}' as col) test;
 

Есть ли какой-либо способ избежать . этого в get_json_object функции?

Ответ №1:

В настоящее время get_json_object() не поддерживает экранирование, см. HIVE-2927

Обходной путь заключается в использовании lateral view json_tuple() :

 select v.rootkey, v.key_a, v.key_b
  from (select '{"rootkey":15,"key.a":16,"key.b":17}' as col) test
       lateral view json_tuple(col, 'rootkey', 'key.a','key.b') v as rootkey, key_a, key_b
;
 

Результат:

 v.rootkey   v.key_a   v.key_b   
15          16        17
 

Комментарии:

1. Спасибо, что указали на обсуждение в jira!