У меня есть внешний сотрудник таблицы ульев, который разделен по extract_timestamp (гггг-мм-дд чч: мм: сс), как показано ниже.
empid empname extract_time
1 abc 2019-05-17 00:00:00
2 def 2019-05-18 14:21:00
Я пытаюсь удалить раздел с помощью extract_time и изменить его на раздел года, месяца и дня. Я следую приведенному ниже методу для этого.
1. Создайте новую таблицу employee_new с разделами год, месяц и день.
create external table employee_new
(empid int,
empname string
)
partitioned by (year int,month int,day int)
location '/user/emp/data/employee_new.txt';
2. вставить перезапись в employee_new, выбрав данные из таблицы сотрудников
insert overwrite into employee_new as select*,year(extract_time),month(extract_time)
,day(extract_time)
from employee
3. Удалите сотрудников и employee_new и создайте таблицу сотрудников поверх /user/emp/data/employee_new.txt.
Пожалуйста, дайте мне знать, эффективен ли этот метод и есть ли более эффективные способы сделать то же самое.
Время извлечения — это временная метка исходного файла, из которого извлекаются данные. Каждый час будет новый файл. Поскольку целевая таблица разбита на разделы по отметке времени, многие разделы создаются динамически, что приводит к слишком большому количеству маленьких нежелательных разделов. Мы хотим разделить на основе дня, месяца и года, чтобы количество разделов можно было уменьшить. Каждый почасовой файл будет иметь 10-25 записей.
Пожалуйста, ответьте на все мои вопросы, это поможет построить оптимальное разбиение. Сценарий использования для столбцов раздела? и зизе. Сейчас вроде не надо разбивать по годам, месяцам, дням. Почему вы хотите разделить по этим столбцам. Пересекаются ли данные в исходных разделах?
Собираетесь ли вы перепроектировать восходящий процесс, чтобы ежечасно записывать в ежедневные папки таблицы, верно? и данные пересекаются, а не уникальны в исходных файлах, потому что существуют обновления существующих данных, верно?
Да, именно так.
Разбивайте только по date yyyy-MM-dd
, если это возможно, если вышестоящий процесс может записывать часовые файлы в ежедневные папки. Для такой маленькой таблицы разбиение по годам, месяцам и дням отдельно кажется излишним. Будет еще слишком много папок.
Если таблица секционирована по дате гггг-мм-дд, обрезка секций будет работать для вашего сценария использования, поскольку вы выполняете запросы по дням, годам или месяцам.
Для фильтрации по году в этом случае вы предоставите
where date >= '2019-01-01' and date < '2020-01-01'
состояние,
фильтровать по месяцам:
where date >= '2019-01-01' and date < '2020-02-01'
и день: where date = '2019-01-01'
Список файловой системы будет работать намного быстрее.
И если невозможно перепроектировать восходящий процесс для записи в папки yyyy-MM-dd, тогда ваш новый дизайн, как вы описали в вопросе (папки yyyy/MM/dd), является единственным решением.
Спасибо, leftjoin. Я проверю, можно ли изменить восходящий процесс.
Несколько вопросов: что означает extract_time? Каков сценарий использования столбцов раздела: новый и старый? И каков размер таблицы и общее количество записей?