Я начну с примера, который поможет выяснить мои требования.
У меня есть таблица с именем schema1.base_tbl
, которая содержит один столбец с именем col_nm_1
, и пример данных приведен ниже:
col_nm_1
abc1234
abc5678
def1234
Я создаю другую таблицу с именем schema1.tbl_dv1
примерно так:
CREATE TABLE schema1.tbl_dv1 row format delimited fields terminated by '|' stored as textfile as
SELECT
struct(col_nm_1)
FROM schema1.base_tbl;
Результат таблицы при запросе select * from schema1.tbl_dv1
c0
{"col1":"abc1234"}
{"col1":"abc5678"}
{"col1":"def1234"}
Я создаю другую таблицу, на этот раз внешнюютаблица для получения данных из schema1.tbl_dv1
:
CREATE EXTERNAL TABLE IF NOT EXISTS schema1.tbl_dv2
(col_data string)
row format delimited fields terminated by '|' stored as textfile
LOCATION
'maprfs:/data/tbl_dv2';
INSERT INTO schema1.tbl_dv1(col_data) SELECT c0 FROM schema1.tbl_dv1;
Результат таблицы при запросе select * from schema1.tbl_dv2
col_data
abc1234
abc5678
def1234
Что не является моим ожидаемым результатом.Результат, который я хочу, должен содержать все разметки, созданные типом данных Struct, т.е. ожидаемый результат:
col_data
{"col1":"abc1234"}
{"col1":"abc5678"}
{"col1":"def1234"}
При просмотре файла детали Hive в каталоге он также должен выглядеть так, как показано выше.
Я знаю, что это имеет отношение к типу Hive String против типа Hive Struct, мне интересно, есть ли способ преобразовать результаты запроса столбца типа Struct, который содержит всю его разметку, вставленную в тип String?