Hive - как отслеживать и обновлять дату последнего изменения в Hive для дельта-таблиц?

У меня есть случай использования, когда исходная таблица в Hive обновляется ежедневно таким образом, что обновляются все данные. В первый день мы загружаем всю таблицу, но со второго дня нас интересуют только те строки, чья «Дата последнего изменения» была обновлена, чтобы отразить дату предыдущего дня.

Предлагаемое решение состоит в том, чтобы сохранить MAX даты последнего изменения в день 1 и день 2, сравнить все строки, дата последнего изменения которых больше, чем сохраненная дата, и обработать только эти строки.

Каков наилучший способ создания, хранения и извлечения этой даты последнего изменения на ежедневной основе? Кроме того, разные таблицы будут иметь разные даты, и в идеале я бы хотел что-то с Table_Name, Last_Modified_Date, если нет лучшего способа сделать это.

Пожалуйста помоги. Спасибо.


person CodingInCircles    schedule 08.01.2015    source источник


Ответы (4)


Если я правильно понял ваш сценарий, при новом ежедневном запуске значение Last_Modified_Date может быть только больше, чем максимальное значение Last_Modified_Date при предыдущем запуске.

В таком случае я бы предложил создать разделение таблицы на Last_Modified_Date и обрабатывать только те записи, которые попадают в этот раздел (что намного быстрее, чем обрабатывать ваше сравнение).

person SvetaG    schedule 08.01.2015
comment
Это могло сработать, но это отметка времени. Не совсем уверен, как метку времени можно использовать в качестве ключа разделения. Кроме того, это часть конвейера ETL, и мы не хотели бы обновлять дату последнего изменения (где бы она ни была сохранена), если мы не уверены, что данные были обработаны. Если это не удастся, и мы обновим дату вслепую, мы можем пропустить день или больше между ними. - person CodingInCircles; 08.01.2015

Возможно ли такое решение?

  1. Извлечь дату из «Даты последнего изменения» в виде нового столбца с именем dateid; Используйте dateid как ключ раздела.
  2. При обновлении всех данных вы можете разделить все данные на разные разделы (это действие может быть реализовано с помощью функции динамического разделения куста).
  3. Затем вы можете обрабатывать данные в last dateid, если вы обрабатываете данные день за днем.
person Jimmy Zhang    schedule 08.01.2015
comment
Данные, с которыми мы работаем, уже размещены там кем-то другим, и мы ничего не можем с этим поделать. Наш конвейер ETL таков, что мы берем эти данные, помещаем их во временное местоположение, перемещаем оттуда в следующее местоположение и затем удаляем временное местоположение. Так что о разделении здесь не может быть и речи. - person CodingInCircles; 08.01.2015

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

person Community    schedule 08.01.2015
comment
Не могли бы вы рассказать подробнее о том, как вам это удалось? - person monkey intern; 29.08.2019

описать отформатированное имя_таблицы ... Вы получите transient_lastDdlTime, которое вы можете преобразовать следующим образом.

ВЫБРАТЬ CAST (from_unixtime (your_transient_lastDdlTime_value) AS timestamp);

С уважением и уважением, Камлешкумар Гуджаратхи

person He llo    schedule 28.02.2019