Есть ли в любом случае для преобразования значений строк в ключи столбцов Hive (HQL)? - PullRequest
1 голос
/ 19 апреля 2019

У меня одна большая база данных, и некоторые значения отформатированы в сложный тип. Например, ключи столбца «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?

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Также вы можете попытаться преобразовать вашу строку в действительный JSON (добавить двойные кавычки и фигурные скобки), а затем использовать json_tuple для извлечения столбцов, но в любом случае вы должны знать имена столбцов и перечислять их в запросе, куст не может динамически выбирать столбцы.

Демонстрация:

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)   

Если данные содержат некоторые ключи, не указанные в запросе, они не будут извлечены.

1 голос
/ 19 апреля 2019

использование 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...