Хорошо!
Если я правильно понимаю вашу ситуацию, у вас есть таблица с поддержкой 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
) для каждого запуска.Но попробуйте первые две попытки вручную, прежде чем переходить к автоматизации, чтобы убедиться, что все идет как надо.
Дайте мне знать, если это поможет!