В Hive, как правильно использовать get_json_object для извлечения значения, когда в пути есть знак `$` - PullRequest
0 голосов
/ 12 февраля 2019
value
{"$screen_width":375,"$app_version":"2.5.0"}

Предположим, у меня есть таблица, показанная выше.Значение "2.5.0" - это то, что я хочу.Я пытаюсь использовать get_json_object, но это не удается.Поскольку путь "$app_version" включает знак $, а Hive рассматривает его как знак корневого каталога.

Я пробую несколько способов кода, но все они терпят неудачу и возвращают NULL.

select get_json_object(value,"$.$app_version")
select get_json_object(value,"$.\\$app_version")
select get_json_object(value,"$.\$app_version")
select get_json_object(value,"$..app_version")

Кто-нибудь из опытных пользователей Hive знает, как это исправить?

Временно, я использую регулярное выражение, чтобы решить эту проблему.

select 
    regexp_extract(
        properties
        ,'\\"\\$os_version\\":\\"[\\d?]+\\.[\\d?]+\\.[\\d?]+\\"'
        ,0
    )
    ,properties
from opd.test_json_object

Однако мне любопытно, что здесь нет возможности использовать get_json_object

1 Ответ

0 голосов
/ 12 февраля 2019

Не уверен, как напрямую получить значение со знаком $, но обычно вам следует рассмотреть lateral view с json_tuple (см. doc ) вместо get_json_object.С точки зрения производительности это намного быстрее, и мне лично нравится тот факт, что столбцы json становятся «обычными» столбцами.

Для вашего примера я бы предложил следующее:

-- CTE to simulate a temporary table
with json as (
  select '{"$screen_width":375,"$app_version":"2.5.0"} ' as value
)
-- actual query
select *
from json 
lateral view 
  json_tuple(value, "$screen_width", "$app_version") lv as 
    screen_width, app_version;

Результат:

+------------------------------------------------+------------------+-----------------+
|                   json.value                   | lv.screen_width  | lv.app_version  |
+------------------------------------------------+------------------+-----------------+
| {"$screen_width":375,"$app_version":"2.5.0"}   | 375              | 2.5.0           |
+------------------------------------------------+------------------+-----------------+

Так что теперь вы можете просто использовать lv.app_version в своем выражении select (вместо моего *), чтобы получить искомое значение.

...