Улей сохраняет нотацию Struct при заполнении строки - PullRequest
0 голосов
/ 16 октября 2018

Я начну с примера, который поможет выяснить мои требования.

У меня есть таблица с именем 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?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Поиск в Stackoverflow Я обнаружил, что это может быть решением:

hive -e "select * from schema1.tbl_dv1" > ~/json_output.txt;

он сохраняет разметки Struct.

0 голосов
/ 17 октября 2018

Вы можете преобразовать структуру в строку Json с помощью brickhouse стороннего Hive UDF.Он имеет функцию to_json, которая может преобразовывать любой сложный тип в строку json.Сначала клонируйте и создайте банку:

git clone https://github.com/klout/brickhouse.git
cd brickhouse
mvn clean package

, затем скопируйте банку Brickhouse в HDFS и добавьте банку в Hive:

add jar hdfs://<your_path>/brickhouse-0.7.1-SNAPSHOT.jar;

зарегистрируйте to_json UDF в Hive

create temporary function to_json as 'brickhouse.udf.json.ToJsonUDF';

Теперь вы можете использовать его, например,

hive> select to_json(ARRAY(MAP('a',1), MAP('b',2)));
OK
[{"a":1},{"b":2}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...