#impala
#impala
Вопрос:
Допустим, у меня есть один файл «fruitsbought.csv», который содержит много записей, содержащих поле даты.
Можно ли «разделить» для повышения производительности, создав таблицу «фрукты» на основе этого текстового файла, при создании раздела, в котором все строки в fruitsbought.txt это соответствовало бы этому разделу, скажем, если бы я хотел сделать это по годам и месяцам, чтобы быть созданным?
Или я должен как часть отдельного процесса создавать каталог для каждого года, а затем помещать соответствующие файлы «.csv», которые отфильтровываются за этот год, в структуру каталогов в HDFS до создания таблицы в impala-shell?
Я слышал, что вы можете создать пустую таблицу, настроить разделы, а затем использовать операторы «Insert», которые содержат раздел, в который входит эта запись. Хотя в моем текущем случае у меня уже есть один файл «fruitsbought.csv», который содержит все записи, которые я хочу в нем, и мне нравится, как я могу просто превратить это в таблицу прямо там (хотя у нее нет parititionig).
Должен ли я разрабатывать отдельный процесс для предварительного разделения одного файла на несколько файлов, отсортированных в нужном разделе? (Один файл очень большой).
Ответ №1:
-
Создайте внешнюю таблицу, используя пример fruitsbought.csv (идентификатор — это просто пример, … — означает остальные столбцы в таблице):
CREATE EXTERNAL TABLE fruitsboughexternal
(
id INT,
.....
mydate STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 'somelocationwithfruitsboughtfile/'; -
Создайте таблицу с разделением по дате
CREATE TABLE fruitsbought(id INT, .....)
PARTITIONED BY (year INT, month INT, day INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
- Импортируйте данные в таблицу fruitsbought, параметры раздела должны быть последними в select (конечно, mydate должен быть в формате, понятном для impala, например 2014-06-20 06:05:25)
INSERT INTO fruitsbought PARTITION(year, month, day) SELECT id, ..., year(mydate), month(mydate), day(mydate) FROM fruitsboughexternal;