Вложенный массив HIVE в типе данных MAP

У меня есть таблица HIVE, структурированная следующим образом: -

Create table test_stg(employee_id INT, name STRING, abu ARRAY <String>, sabu MAP <String, ARRAY<INT>)
row format delimited fields terminated by '|'                                                              
collection items terminated by '/'                                                                         
map keys terminated by ':'; 

Я буду импортировать данные из локальной файловой системы, используя LOAD DATA LOCAL....

Вопрос в том, как мне создать содержимое моего локального файла, чтобы поле типа данных карты sabu могло иметь вложенный массив.

Заранее спасибо.


person techvineet    schedule 15.09.2013    source источник


Ответы (2)


Разделители Hive по умолчанию:

  • Разделитель строк => Control-A ('\001')
  • Разделитель элементов коллекции => Control-B ('\002')
  • Разделитель ключей карты => Control-C ('\003')

Если вы переопределяете эти разделители, то во время синтаксического анализа используются переопределенные разделители. Приведенное выше описание разделителей верно для обычного случая плоских структур данных, где сложные типы содержат только примитивные типы. Для вложенных типов разделитель определяется уровнем вложенности.

Например, для массива массивов разделителями для внешнего массива являются символы Control-B ('\002'), как и ожидалось, но для внутреннего массива это символы Control-C ('\003'), следующие разделитель в списке.

На самом деле Hive поддерживает восемь уровней разделителей, соответствующих кодам ASCII 1, 2, ... 8, но вы можете переопределить только первые три.

В вашем случае разделитель для элементов во вложенном поле типа данных «Массив карты» sabu будет «\004», поскольку разделитель ключа карты — «\003» (переопределено как ':') .

Таким образом, вы можете записать свой входной файл в следующем формате:

1|JOHN|abu1/abu2|key1:1'\004'2'\004'3/key2:6'\004'7'\004'8

Выход SELECT * FROM test_stg; будет:

1       JOHN     ["abu1","abu2"]     {"key1":[1,2,3],"key2":[6,7,8]}

Ссылка: Hadoop The Definitive Guide — Chapter 12: Hive, Page No: 433, 434

person GS Majumder    schedule 16.09.2013
comment
У меня возникли проблемы с добавлением ctrl+d в Ubuntu, и я разобрался с этой ссылкой h30499.www3.hp.com/t5/General/vi-inserting-control-characters/ - person techvineet; 17.09.2013

Я нахожу простой способ сделать это в 3 шага. Также ссылка из «Hadoop The Definitive Guide — Chapter 12: Hive».

hive> создать таблицу test_stg2 как select 1, 'name', array('str1','str2'), map('key',array(1,2)) из манекена;

$ hdfs dfs -copyToLocal /пользователь/улей/склад/test_stg2/000000_0 test_stg2_dump

$ vi test_stg2_dump

1 ^ Имя ^ Astr1 ^ Bstr2 ^ Akey ^ C1 ^ D2

Это то, что вам нужно. И уровень вложения определяет, каким будет ваш разделитель.

person Jacky    schedule 04.11.2014