Есть ли способ разделить существующий текстовый файл с помощью Impala без предварительного разделения файлов на секционированные каталоги?

#impala

#impala

Вопрос:

Допустим, у меня есть один файл «fruitsbought.csv», который содержит много записей, содержащих поле даты.

Можно ли «разделить» для повышения производительности, создав таблицу «фрукты» на основе этого текстового файла, при создании раздела, в котором все строки в fruitsbought.txt это соответствовало бы этому разделу, скажем, если бы я хотел сделать это по годам и месяцам, чтобы быть созданным?

Или я должен как часть отдельного процесса создавать каталог для каждого года, а затем помещать соответствующие файлы «.csv», которые отфильтровываются за этот год, в структуру каталогов в HDFS до создания таблицы в impala-shell?

Я слышал, что вы можете создать пустую таблицу, настроить разделы, а затем использовать операторы «Insert», которые содержат раздел, в который входит эта запись. Хотя в моем текущем случае у меня уже есть один файл «fruitsbought.csv», который содержит все записи, которые я хочу в нем, и мне нравится, как я могу просто превратить это в таблицу прямо там (хотя у нее нет parititionig).

Должен ли я разрабатывать отдельный процесс для предварительного разделения одного файла на несколько файлов, отсортированных в нужном разделе? (Один файл очень большой).

Ответ №1:

  1. Создайте внешнюю таблицу, используя пример fruitsbought.csv (идентификатор — это просто пример, … — означает остальные столбцы в таблице):

    CREATE EXTERNAL TABLE fruitsboughexternal
    (
    id INT,
    .....
    mydate STRING
    ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    LOCATION 'somelocationwithfruitsboughtfile/';

  2. Создайте таблицу с разделением по дате

CREATE TABLE fruitsbought(id INT, .....)
PARTITIONED BY (year INT, month INT, day INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

  1. Импортируйте данные в таблицу 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;