2015-01-29 3 views
1

У меня есть строка json, в которой есть поле под названием version. Версия может либо отсутствовать, либо если она есть, она будет иметь форму x.y .Преобразование строк в куст

Я хочу, чтобы преобразовать это в X.0 я сейчас делаю

CONCAT (раскол (get_json_object (JSon, '$ .version'), '[.]') [0] ". "," 0 ")

но это не касается случаев, когда версия там отсутствует.

Я хочу, чтобы «bad_version» возвращалось, если версии там нет. Могу ли я каким-то образом использовать COALESCE и делать некоторые настройки?

ответ

0

Да, вы можете использовать либо COALESCE, либо CASE - синтаксис идентичен используемому в базе данных.

select coalesce(myField, 'bad_version') .... 

или

select case when myField is null then 'bad_version' else myField end as x .... 
+0

раскол выбросит ошибку, когда версия не там правильно? – Peter

+0

Этого не следует делать: я могу выпустить 'select split (null, '-') ...' и он не генерирует никаких исключений (Hive 0.10) - он возвращает 'null'. Я не знаю о функции 'get_json_object'. – davek

0

можно условно проверить результат get_json_object, чтобы увидеть, если это NULL и вернуть bad_version соответственно. Когда версия действительна, вы можете использовать регулярное выражение для замены младшей версии 0.

SELECT 
    IF(get_json_object(json, "$.version") IS NULL, 
    "bad_version", 
    regexp_replace(get_json_object(json, "$.version") , "\\..*$", ".0") 
) 
FROM json_table; -- The table I loaded with test data 

Некоторые простой пример данных:

hive> SELECT json FROM json_table; 
OK 
{"id":"001","version":"3.9"} 
{"id":"002","notversion":"3.9"} 
Time taken: 0.225 seconds, Fetched: 2 row(s) 

И тогда результаты этого запроса в отношении этих данных:

hive> SELECT 
    > IF(get_json_object(json, "$.version") IS NULL, 
    >  "bad_version", 
    >  regexp_replace(get_json_object(json, "$.version") , "\\..+$", ".0") 
    > ) 
    > FROM json_table; 
OK 
3.0 
bad_version 
Time taken: 0.225 seconds, Fetched: 2 row(s)