Hive - Огромное перераспределение таблиц по 10 ТБ (Добавление новых столбцов разделов) - PullRequest
0 голосов
/ 06 апреля 2019

Techies,

Фон - У нас есть существующая таблица кустов размером 10 ТБ, которая была разделена на столбцы A. В бизнес-случае произошли изменения, которые теперь требуют добавления столбца B раздела в дополнение к столбцу A.

Постановка проблемы - Поскольку данные в HDFS слишком велики и их необходимо реструктурировать для наследования нового столбца раздела B, мы сталкиваемся с трудностью копирования таблицы в резервную копию и повторного ввода с использованием простого IMPALA INSERT OVERWRITE в основную таблицу.

Мы хотим выяснить, существует ли эффективный способ добавления столбцов секционирования в такую ​​огромную таблицу

1 Ответ

1 голос
/ 06 апреля 2019

Хорошо!

Если я правильно понимаю вашу ситуацию, у вас есть таблица с поддержкой 10 ТБ данных в HDFS с разделом в столбце A, и вы хотите добавить раздел также в столбце B.

Таким образом, если столбец B будет подразделом, каталог HDFS будет выглядеть как пользователь / hive / warehouse / database / table / colA / colB или / colB / colA в противном случае (рассматривая его как управляемую таблицу).

Реструктуризация каталога HDFS вручную не будет хорошей идеей, потому что это станет кошмаром для сканирования данных всех файлов и организации их соответственно в соответствующей папке.

Ниже приведен один из способов сделать это:

1. Создать новую таблицу с новой структурой, т. Е. С разделами на столбцах A и B.

CREATE TABLE NEWTABLE ( COLUMNS ... ) PARTITON ON ( COL_A INT, COL_B INT )

2.a. Вставить данные из старой таблицы в новую таблицу (созданную на шаге 1), как показано ниже,

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE

Но да, этот шагпотребует много ресурсов во время выполнения, если не будет обработан должным образом, место в HDFS для хранения результатов в виде данных для NEWTABLE и, конечно, времени.

ИЛИ

2.b. Если вы считаете, что HDFS не будет достаточно места для хранения всех данных или ресурсов, я бы предложил вам выполнить эту INSERT в пакетах с удалением старых данных после каждой операции INSERT.

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE
WHERE COL_A='abc'

DELETE FROM OLDTABLE
WHERE COL_A='abc'

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE
WHERE COL_A='def'

DELETE FROM OLDTABLE
WHERE COL_A='def'

.
.
.
so on.

Таким образом, вы можете выгрузить HDFS с уже обработанными данными и сбалансировать пространство.

Если вы выполните шаг 2.b. , тогда вы можете написатьСкрипт для автоматизации этого процесса путем динамической передачи имен разделов (полученных из SHOW PARTITIONS) для каждого запуска.Но попробуйте первые две попытки вручную, прежде чем переходить к автоматизации, чтобы убедиться, что все идет как надо.

Дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...