Изменение спецификации раздела таблицы куста и перемещение данных

У меня есть внешний сотрудник таблицы ульев, который разделен по 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.

Пожалуйста, дайте мне знать, эффективен ли этот метод и есть ли более эффективные способы сделать то же самое.

Несколько вопросов: что означает extract_time? Каков сценарий использования столбцов раздела: новый и старый? И каков размер таблицы и общее количество записей?

leftjoin 18.05.2019 09:35

Время извлечения — это временная метка исходного файла, из которого извлекаются данные. Каждый час будет новый файл. Поскольку целевая таблица разбита на разделы по отметке времени, многие разделы создаются динамически, что приводит к слишком большому количеству маленьких нежелательных разделов. Мы хотим разделить на основе дня, месяца и года, чтобы количество разделов можно было уменьшить. Каждый почасовой файл будет иметь 10-25 записей.

SreeVik 18.05.2019 10:27

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

leftjoin 18.05.2019 10:35
сценарий: Мы хотим получить данные на основе дня года и месяца. Столбцы: 30-40. Размер: таблица содержит около 1 миллиона записей. Он растет с каждым днем, так как мы получаем 24 файла в день. Пересекаются ли данные в исходных разделах? : Да, это так. Раньше каждый час был новым разделом, и это создавало слишком много маленьких разделов. Однако данные извлекаются из таблицы за день, месяц или год, а не за час. Поэтому запросы, пытающиеся получить данные из этой таблицы за сутки, выполняются долго.
SreeVik 18.05.2019 10:54

Собираетесь ли вы перепроектировать восходящий процесс, чтобы ежечасно записывать в ежедневные папки таблицы, верно? и данные пересекаются, а не уникальны в исходных файлах, потому что существуют обновления существующих данных, верно?

leftjoin 18.05.2019 11:33

Да, именно так.

SreeVik 18.05.2019 13:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
333
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Разбивайте только по 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. Я проверю, можно ли изменить восходящий процесс.

SreeVik 19.05.2019 13:19

Другие вопросы по теме