Ответ 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/компрессионными кодеками и выполните некоторые тесты производительности для вашего подхода.