Подтвердить что ты не робот

Есть ли способ загрузить CSV-данные в "двоичный" формат Hive?

Мне интересно, есть ли способ загрузить CSV-данные в бинарный формат Hive - то есть сделать то же самое, что и загрузка данных в реляционной базе данных: разбор и преобразование типа ввода и сохранение его в двоичном формате ( в другом двоичном файле в случае Hive). В ссылке Hive указано, что команда load data inpath не выполняет "никакого преобразования", поэтому я подозреваю, что типы не преобразуются, например, из строки в целое. Я читал о форматах OCR и RCFile, но мне не удалось выяснить, являются ли, например, строковые значения из CSV, преобразованными в числовые значения машин и хранятся в HDFS. Это так? Какие еще существуют возможности для создания двоичных представлений CSV файлов в Hive?

В соответствующей заметке: Я подозреваю, что Hive преобразовывает строковые значения в представления машин во время обработки запроса и не является, например, сравнивает строковые значения - это предположение правильно?

4b9b3361

Ответ 1

По умолчанию Hive просто хранит файлы в виде текстовых файлов и сохраняет записи как обычный текст, все несжатые. Он использует ASCII 0x1 для разделителя полей, который более удобен, чем запятая для некоторых входов, но я уверен, что вы разработали, как заставить Hive работать с значениями, разделенными запятыми. Если вы хотите, чтобы Hive использовал другой формат файла, сериализовать/десериализовать по-другому или сжать данные, у вас есть несколько разных вариантов для игры.

Вне коробки, Hive поддерживает несколько различных форматов файлов: TEXTFILE, SEQUENCEFILE и RCFILE. Различия между ними связаны с тем, как файлы считываются, разделяются и записываются. TEXTFILE является стандартным и работает с обычными текстовыми файлами. SEQUENCEFILE - это двоичный формат пары ключ-значение, который легко потребляется другими частями экосистемы Hadoop. И RCFILE - это ориентированный на столбцы способ сохранения таблиц Hive. В дополнение к этим форматам файлов вы можете написать свои собственные или найти тех, кто написал другие, для удовлетворения различных потребностей.

В дополнение к файловому формату ваши данные сохранены в, вы можете решить, как записи в таблице должны быть сериализованы и десериализованы, указав SerDe. Улей 0.9.1 и выше поставляется с AvroSerDe, и Avro сохраняет данные в двоичном формате (у него также есть сама схема, которая вводит некоторые сложности). Поиск Google для "hive binary SerDe" показал LazyBinarySerde, который звучит как более простой способ сохранения в двоичном формате. И если вы не можете найти что-либо по своему усмотрению, вы всегда можете написать свой собственный SerDe.

Я предполагаю, что ваш вопрос вписывается в большой контекст того, как сделать таблицы Hive меньшими и/или более эффективными. С этой целью вы можете применить сжатие поверх всего, что я упомянул выше. Для этого просто скажите Hive, чтобы сжать его и сказать, какой кодек будет сжиматься с помощью следующих команд:

hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec

Вы можете изменить это в своих конфигурационных файлах, если вы хотите, чтобы эти настройки сохранялись за пределами сеанса (включая другие задания Hive и MapReduce для людей, если вы используете кластер). Я использую SnappyCodec, потому что он работает с Hive из коробки, является разделяемым и дает хорошее сжатие/декомпрессию для затраченного времени процессора. Вы можете решить, что другой кодек более подходит для ваших нужд.

Теперь, как вы применяете все эти параметры, если все ваши данные находятся в формате CSV? Самый простой способ - создать таблицу поверх файлов CSV, затем создать другую таблицу с файловым форматом и SerDe, а затем вставить данные из таблицы с поддержкой CSV в новую таблицу (убедитесь, что вы сжали свой вывод Hive с вашим кодеком выбора). Под капотом, Hive позаботится о чтении данных из одного формата (CSV) и записи в другое (независимо от того, что вы решили). После этого у вас будет дубликат данных, и вы можете сбросить файлы CSV, если хотите.

CREATE EXTERNAL TABLE csv_table (id INT, name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
LOCATION /user/muehlbau/yourData;

CREATE TABLE binary_table (id INT, name STRING)
ROW FORMAT SERDE org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe
STORED AS SEQUENCEFILE;

set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec

INSERT OVERWRITE TABLE binary_table
SELECT * FROM csv_table

В приведенном выше примере демонстрируется, как вы можете использовать все доступные вам опции, но не думайте об этом как о стандартном разумном прецеденте. Ознакомьтесь с различными форматами файлов/SerDes/компрессионными кодеками и выполните некоторые тесты производительности для вашего подхода.