Несколько паркетных файлов при записи в Hive Table (в инкрементах) - PullRequest
0 голосов
/ 28 декабря 2018

Имея разделенную таблицу Hive

CREATE EXTERNAL TABLE IF NOT EXISTS CUSTOMER_PART ( 
  NAME string ,
  AGE int ,
  YEAR INT)
  PARTITIONED BY (CUSTOMER_ID decimal(15,0))
  STORED AS PARQUET LOCATION 'HDFS LOCATION'

Первая LOAD выполняется из ORACLE в HIVE через PYSPARK с использованием

INSERT OVERWRITE TABLE CUSTOMER_PART PARTITION (CUSTOMER_ID) SELECT NAME, AGE, YEAR, CUSTOMER_ID FROM CUSTOMER;

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

INSERT INTO TABLE CUSTOMER_PART PARTITION (CUSTOMER_ID = 3) SELECT NAME, AGE, YEAR FROM CUSTOMER WHERE CUSTOMER_ID = 3; --Assume this gives me the latest record in the database

Есть ли возможность добавить значение к существующему файлу паркета в разделе, пока оно не достигнет размера блока?без создания файлов меньшего размера для каждой вставки.

Перезапись всего раздела является одним из вариантов, но я бы предпочел не делать этого

INSERT OVERWRITE TABLE CUSTOMER_PART PARTITION (CUSTOMER_ID = 3) SELECT NAME, AGE, YEAR FROM CUSTOMER WHERE CUSTOMER_ID = 3;

Следующие свойства установлены для Hive

set hive.execution.engine=tez; -- TEZ execution engine
set hive.merge.tezfiles=true; -- Notifying that merge step is required
set hive.merge.smallfiles.avgsize=128000000; --128MB
set hive.merge.size.per.task=128000000; -- 128MB

Что по-прежнему не помогает с ежедневными вставками.Любой альтернативный подход, который можно использовать, будет очень полезен.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Я мог бы подумать о следующих подходах для этого случая:

Подход 1:

Повторное создание таблицы кустов, т. Е. После загрузки дополнительных данныхв CUSTOMER_PART таблицу.

  • Создание таблицы temp_CUSTOMER_PART со всем снимком таблицы CUSTOMER_PARTданные.

  • Выполнить перезапись окончательной таблицы CUSTOMER_PART с выбором temp_CUSTOMER_PART таблица

  • В этом случае у вас будет финальная таблица без небольших файлов.

  • ПРИМЕЧАНИЕ вам нужно убедиться, что новые данные не вставляютсяв таблицу CUSTOMER_PART после создания временной таблицы.


Подход 2:

Используя функцию input_file_name (), используя ее:

  • проверьте, сколько отдельных имен файлов имеется в каждом разделе, затем выберитетолько те разделы, которые имеют большеn 10..etc файлов в каждом разделе.

  • Создайте temporary table с этими разделами и overwrite the final table только с выбранными разделами.

  • ПРИМЕЧАНИЕ необходимо убедиться, что в таблицу CUSTOMER_PART после создания временной таблицы не добавляются новые данные, поскольку мы собираемся перезаписать итоговую таблицу.


Approach3:

Hive (без искры) предлагает перезапись и выберите ту же таблицу.т. е.

insert overwrite table default.t1 partition(partiton_column) 
select * from default.t1; //overwrite and select from same t1 table
  • Если вы следуете этим путем, тогда должно быть hive job triggered, как только ваша искровая работа закончится.

  • Улей будетполучить блокировку, пока running overwrite/select той же таблицы, так что если какое-либо задание, которое пишет в таблицу, будет ждать.

Кроме того: Orc format предложит сцепление , которое объединит небольшие файлы ORC для создания нового файла большего размера.

 alter table <db_name>.<orc_table_name> [partition_column="val"] concatenate;
0 голосов
/ 28 декабря 2018

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

Поскольку вы упоминаете, что импортируете данные из БД Oracle,Вы можете импортировать все данные каждый раз из базы данных Oracle и перезаписывать в HDFS.Таким образом, вы можете сохранить один файл детали.

Также HDFS не рекомендуется для небольших объемов данных.

...