#sql #database #hive
#sql #База данных #улей
Вопрос:
У меня одна большая база данных, и некоторые значения отформатированы сложным типом. Например, ключи столбцов ‘sat’ форматируются следующим образом:
id sat
5 'a:100, b:200'
6 'b:300, c:150'
7 'some_other_unknown_key:900'
Я хочу преобразовать таблицу в следующий формат и выполнить дополнительную статистику.
id a b c some_other_unknown_key
5 100 200 null null
6 null 300 150 null
7 null null null 900
Есть ли какой-нибудь способ сделать это без создания новых таблиц с помощью HQL?
Комментарии:
1. Согласно кодексу поведения, никогда не добавляйте «Спасибо» в конце вопроса.
2. Какую СУБД вы используете? Oracle, MySQL, SQL Server?
3. Я не уверен в СУБД. Другие ребята настроили его и предоставили веб-интерфейс, где я могу запустить запрос HQL. Они называют это HIVE.
Ответ №1:
используйте REGXP_EXTRACT
select id, regexp_extract(foo,'a:([0-9] )',1) as a,
regexp_extract(foo,'b:([0-9] )',1) as b,
regexp_extract(foo,'c:([0-9] )',1) as c from t;
Комментарии:
1. Спасибо. Это может решить большую часть моей проблемы. Что, если ‘a’, ‘b’, ‘c’ — это случайное значение, и я не знаю, что это на самом деле перед запросом?
2. @oliver: То, что вы ищете, — это динамический свод. Прямого способа сделать это нет. Вы должны использовать другой процедурный язык / скрипт (Java / Shell script) для динамического построения запроса, подобного приведенному выше, перед его запуском. Лучшим подходом является изменение дизайна таблицы и сохранение значений отдельно или с использованием json, поскольку столбец sat выглядит близким к json.
Ответ №2:
Также вы можете попытаться преобразовать свою строку в допустимый JSON (добавить двойные кавычки и фигурные скобки), затем использовать json_tuple для извлечения столбцов, но в любом случае вы должны знать имена столбцов и перечислять их в запросе, hive не может динамически выбирать столбцы.
ДЕМОНСТРАЦИЯ:
with your_table as (--Use your table instead of this
select stack(3, 5, 'a:100, b:200',
6, 'b:300, c:150',
7, 'some_other_unknown_key:900'
) as (id, sat)
)
select t.id, p.a, p.b, p.c, p.some_other_unknown_key
from your_table t
lateral view outer json_tuple(concat('{',regexp_replace(t.sat,'([a-z_A-Z]*):','\"$1\":'),'}'), 'a','b','c','some_other_unknown_key') p as a,b,c,some_other_unknown_key;
Результат:
OK
id a b c some_other_unknown_key
5 100 200 NULL NULL
6 NULL 300 150 NULL
7 NULL NULL NULL 900
Time taken: 0.128 seconds, Fetched: 3 row(s)
Если данные содержат некоторые ключи, не перечисленные в запросе, они не будут извлечены.