Шаблон реализации регулярной передачи данных в S3

Редактировал(а) Татьяна Брыкова 2026/02/12 12:41

Глоссарий

ТерминОпределение
Сущностьэто любой однозначно идентифицируемый конкретный или абстрактный объект, включая события и связи между объектами, информация о котором хранится и обрабатывается в базе данных (БД).
Например – позиции чеков, контакты.
Объектное хранилище S3облачный сервис, позволяющий хранить файлы любого типа и объема
Бакет S3сущность для организации хранения в хранилище
СУБД Manzanaсистема управления аналитической базой данных Manzana Clickhouse

Цель

Реализация передачи данных в бакет S3 необходима в целях обеспечения возможности построения аналитики по данным программы Лояльности на стороне Заказчика.

Обзор и обоснование

  1. В рамках проекта возможна настройка S3 для предоставления возможности скачивания данных из аналитического модуля Manzana CDP в формате выгрузок с помощью S3.
  2. Забор данных и дальнейшая их обработка реализуется на стороне Заказчика.

В связи с указанным обоснованием необходимо реализовать процесс передачи данных посредством S3 ежедневно по заданному расписанию.

Бизнес-процессы и требования

Реализация передачи данных включает:

  • Создание бакета S3.

Бакет S3 должен иметь настройку на хранение файлов в течение 7 дней, а также 2 учётные записи: на запись файлов для Manzana, на чтение и копирование файлов для Заказчика.

  •  Написание запросов на выгрузку по примерам из Приложений 1-9.

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

  • Настройка расписания выгрузки данных.

Выгрузка перечисленных данных осуществляется ежедневно в 5:00 МСК.

  • Тестирование полноты выгруженных файлов.

Включает однократную сверку соответствия данных выгруженных файлов с данными в аналитической базе данных.

При инкрементальной выгрузке выгружается только накопленный дневной инкремент, но выгрузка происходит каждый раз в новый файл, в имени которого стоит пометка даты и времени выгрузки.

То есть формат имени инкрементального файла выглядит так:

«имя сущности_дата_время.csv.gz»

Дальнейшие действия по интеграции для забора данных осуществляются самостоятельно сотрудниками Заказчика.

Технологически мы разделяем выгрузку на два вида:

1. Полная, для сущностей:

  • Contacts (контакты)
  • Cards (карты)
  • Shops (магазины)
  • Rules (правила)
  • Articles (товары)
  • Campaigns (кампании)

При полной выгрузке выгружаются все данные имеющиеся в справочнике в файл на s3.

2.  Инкрементальная, для сущностей:

  • Chequeitems (позиции чеков)
  • Bonuses (бонусы)
  • Coupons (купоны)

Список сущностей и состав файлов

В этом разделе приводится описание структуры данных содержащихся в файлах, которые будут выгружены в S3. Ниже перечислен список таблиц, передаваемых в S3:

  1. Контакты
  2. Карты
  3. Магазины
  4. Кампании
  5. Правила списания и начисления бонусов
  6. Товары
  7. Позиции чеков
  8. Бонусы начисления или списания
  9. Номерные купоны

Файл contacts.csv.gz

Таблица отображает структуру файла и описание данных по контакту, подлежащих полной выгрузке в S3.

ПолеОписание
contact_idидентификатор контакта
registration_dtдата/время регистрации контакта в ПЛ
instance_idидентификатор инстанса - системное поле
level_idидентификатор текущего уровня контакта
organization_idидентификатор организации контакта
bd_correctпризнак корректности указанного дня рождения контакта
y_bdгод рождения контакта
md_bdмесяц-день рождения контакта
birth_datetimestamp даты рождения контакта
gender_rusпол контакта
number_of_childколичество детей у контакта
email1email
could_check_emailпризнак возможности отправки коммуникации контакту по email (0=невозможно, 1=возможно)
mobile_phoneмобильный телефон
could_check_mobile_phoneпризнак возможности отправки коммуникации контакту по мобильному телефону, учитывая корректность указания мобильного телефона (0=невозможно, 1=возможно)
could_check_mobile_phone_not_maskпризнак возможности отправки коммуникации контакту по мобильному телефону (0=невозможно, 1=возможно)
contact_crm_guidguid контакта
sum_discсумма со скидкой - одноименное поле в loyalty.contact_cur
max_sale_dateдата последней покупки - без учета типа операции покупки
cheque_countколичество чеков - одноименное поле в loyalty.contact_cur
avg_chequeсредний чек со скидкой контакта в коп. - одноименное поле в loyalty.contact_cur
avg_cheque_without_discсредний чек контакта в коп. - одноименное поле в loyalty.contact_cur
bonus_valueколичество бонусов контакта - одноименное поле в loyalty.contact_cur
status_valueколичество статусных бонусов контакта - одноименное поле в loyalty.contact_cur
active_bonus_valueколичество активных бонусов контакта - одноименное поле в loyalty.contact_cur
active_status_valueколичество активных статусных бонусов контакта - одноименное поле в loyalty.contact_cur
first_nameимя контакта
last_nameфамилия контакта
middle_nameотчество контакта
full_nameполное имя контакта
region_idидентификатор региона регистрации контакта
first_shop_dдата первой покупки контакта
last_shop_dдата последней покупки контакта
first_shop_idидентификатор первого магазина покупки
last_shop_idидентификатор последнего магазина покупки
freq_shop_idидентификатор магазина частой покупки
contact_source_idидентификатор источника информации о контакте
contact_sourceназвание источника информации о контакте
eaРА контакта. MAP(key, value)
push_notificationвозможность отправки push уведомлений
orgunit_idидентификатор магазина регистрации
pref_orgunit_idидентификатор магазина предпочитаемых покупок
freq_orgunit_idидентификатор магазина частых покупок
is_email_verifiedпризнак верифицированного email
state_contactстатус контакта
status_codeисточник анкеты контакта
is_walletналичие карты в Wallet
email_hashхэш email контакта
active_contactпризнак активности контакта
defaultcardкарта по умолчанию
agreetoterms_idидентификатор согласия на обработку персональных данных
agreetotermsсогласие на обработку персональных данных
has_anket_scan_idидентификатор наличия скана анкеты
has_anket_scanналичие скана анкеты
mobileappналичие мобильного приложения
allowerecieptсогласие на электронный чек
is_delпризнак удаления контакта
validity_idидентификатор валидности анкеты контакта
validityвалидность анкеты контакта
registration_dДата регистрации контакта в ПЛ
registration_dateДата регистрации контакта в ПЛ (Тип данных Int64)
years_oldКоличество полных лет
days_to_bdКоличество дней до дня рождения. Отрицательное значение - количество дней после дня рождения
days_to_future_bdКоличество дней до ближайшего дня рождения
contact_source_idID источника информации о контакте
contact_sourceНазвание источника информации о контакте
wallet_bind_dateДата привязки карты в приложении Wallet
wallet_unbind_dateДата отвязки карты из приложения  Wallet
contact_crmguidGUID контакта
allownotificationПризнак разрешения на уведомления
unsubhashХэш ссылки на отписку
last_cardПоследняя привязанная карта
dt_loadДата/время последней обработки записи в DWH
contact_typeТип контакта
city_nameНазвание города контакта
mobileverifiedПризнак верификации телефона
timezoneЧасовой пояс
editable_levelПризнак изменения уровня клиента в ручную
phone_hashХеш телефона
cards_countКоличество карт
donotphoneРазрешение на коммуникацию по телефону
participant_statusСтатус участия
check_valid_emailПроверка валидации e-mail
created_onДата создания записи контакта
preferred_hourПредпочитаемые часы целевого действия
modified_onДата изменения контакта
owner_idОтветственный за изменения
subject_idсубъект правоотношений в ML

Файл cards.csv.gz

Таблица отображает структуру файла и описание данных по картам, подлежащих полной выгрузке в S3.

ПолеОписание
card_idидентификатор бонусной карты
card_nameномер карты
card_type_idидентификатор типа карты
card_typeтип карты
card_status_idидентификатор статуса карты
card_statusстатус карты
card_state_idидентификатор состояния карты
card_stateсостояние карты
master_account_idидентификатор мастер-аккаунта
is_has_masteraccountпризнак наличия мастер-аккаунта
eaрасширенные атрибуты карты. Массив кортежей (ключ, значение)
last_transaction_dateдата последней транзакции по карте
contact_idID контакта
activation_dateДата активации карты
status_dateДата смены статуса
card_levelID уровня карты
bonus_type_idID вида карты
bonus_typeВид карты
card_start_dateДата выпуска карты
dt_loadДата/время последней обработки записи в DWH
is_delПризнак удаленной карты
card_end_dateДата закрытия карты
first_shop_dДата первой покупки
last_shop_dДата последней покупки
first_shop_idID магазина первой покупки контакта
last_shop_idID магазина последней покупки контакта
secondary_idNFC номер карты
emission_task_idИД задания на выпуск карты
card_registration_dateДата регистрации карты

Файл shops.csv.gz

Таблица отображает структуру файла и описание данных по магазину, подлежащих полной выгрузке в S3.

ПолеОписание
orgunit_idидентификатор магазина регистрации контакта
nameназвание магазина
eaРА магазина
date_openдата открытия
cityидентификатор города
regionидентификатор региона
region_nameназвание региона
characteristicsмассив характеристик магазина
external_idвнешний идентификатор товара
addressадрес магазина
opening_timeВремя открытия магазина
closing_timeВремя открытия магазина

Файл campaigns.csv.gz

Таблица отображает структуру файла и описание данных по кампании, подлежащих полной выгрузке в S3.

ПолеОписание
campaign_idидентификатор кампании
campaign_nameназвание кампании
actual_startдата начала кампании
actual_endдата окончания кампании
external_idрасширеный аттрибут кампании
is_activeпризнак активности кампании

Файл rules.csv.gz

Таблица отображает структуру файла и описание данных по правилам, для дальнейшей полной выгрузке в S3.

ПолеОписание
rule_idидентификатор правила
rule_nameназвание правила
campaign_idID компании
campaign_nameНазвание кампании
date_fromДата начала акции
date_to,Дата окончания акции
owner_idID владельца
is_activeСтатус правила
bonus_typeТип начисляемых бонусов
use_commodity_campaign-
use_personal_campaignСтатус применения персонального предложения
use_certificateСтатус применения сертификата
use_articlesetСтатус применения списка товаров
external_idВнешний идентификатор правила

Файл articles.csv.gz

Таблица отображает структуру файла и описание данных по товару, подлежащих полной выгрузке в S3.

ПолеОписание
idидентификатор товара
article_nameназвание товара
extgroup_nameгруппа товара
subgroup_nameподгруппа товара
subcategory_nameподкатегория товара
category_nameкатегория товара
brand_nameбренд товара
ch1характеристика товара 1
ch2характеристика товара 2
ch3характеристика товара 3
ch4характеристика товара 4
external_idвнешний идентификатор товара
extgroup_pidХЭШ группы товара
subcategory_pidХЭШ подгруппы товара
category_pidХЭШ категории товара
extgroup_external_idВнешний ид группы
subgroup_external_idВнешний ид подгруппы
subcategory_external_idВнешний ид подкатегории
category_external_idВнешний ид категории
string1Строковый параметр 1 (параметр относящийся к товару)
source_idИдентификатор не в хэш вариант
min_calc_priceМинимальная расчетная цена (параметр относящийся к товару)
manufacturer_idID Производителя
manufacturer_nameНазвание производителя
icon_urlЗначек URL
guidGUID
source_tableАтрибут таблицы источника данных

Файл chequeitems_дата_время.csv.gz

Таблица отображает структуру файла и описание данных по чеку, подлежащих инкрементальной выгрузке в S3.

ПолеОписание
ch_numberномер чека
dtдата чека
oper_typeтип операции чека. 1=Продажа, 2=Возврат
article_idидентификатор артикула позиции чека
priceцена позиции чека в копейках
quantityколичество товаров позиции чека
summdiscсумма со скидкой позиции чека в копейках
summсумма позиции чека в копейках
discountсумма скидки позиции чека в копейках
cheque_idидентификатор чека
chequeitem_idидентификатор позиции чека
card_idидентификатор карты чека
coupon_numмассив номеров купона чека
ea_chРА чека. Массив кортежей (ключ, значение)
ea_ciРА позиции чека. Массив кортежей (ключ, значение)
bo_chбонус чека. Массив кортежей (сумма бонуса, правило бонуса, кампания бонуса, идентификатор бонуса, признак статусности бонуса, тип бонуса)
bo_ciбонус позиции чека. Массив кортежей (сумма бонуса, правило бонуса, кампания бонуса, идентификатор бонуса, признак статусности бонуса, тип бонуса
shop_idидентификатор магазина
pos_idидентификатор кассового терминала
is_delпризнак удаления позиции чека
contact_idидентификатор контакта на момент покупки. На момент построения отчета может быть неактуальным
oper_type_nameназвание операции чека
position_numberномер позиции чека
dДата
ymДата/время
campaign_idМассив ID кампаний чека/позиции чека
summ_chОбщая сумма чека. Только для фильтрации
summdisc_chОбщая сумма позиции чека. Только для фильтрации
partition_idID партиций
dt_loadДата/время последней обработки позиции чека в DWH
d_loadДата последней обработки позиции чека в DWH
start_of_week_from_thursdayДата начала четверговой недели чека
start_of_monthДата начала месяца чека
paid_by_bonusОплачено бонусами в рублях
mcpМинимальная розничная цена товара
payment_typeМассив из типов и сумм платежей
card_type_idID типа карты
state_contactСтатус контакта - state_contact = 0 условие фильтра, отбирает только активные контакты
is_del_contactПризнак удаления контакта
freq_shopМагазин частых покупок
agreetotermsСогласие контакта на обработку персональных данных
smsМобильный телефон
emailЕ-мэйл
sms_sendРазрешение на коммуникацию по SMS
bonus_balanceБаланс бонусов
max_sale_dateДата последней покупки
region_nameНазвание региона
brand_nameБренд
article_external_idВнешний идентификатор товара

Файл bonuses_дата_время.csv.gz

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

ПолеОписание
bonus_idидентификатор бонуса начисления
is_deleteпризнак удаления бонуса начисления или списания
valueсумма в копейках бонуса начисления или списания
dt_createdдата/время создания бонуса начисления или списания
d_createdдата создания бонуса начисления или списания
parent_type_idparent_type_id бонуса начисления или списания
rule_idправило бонуса начисления или списания
campaign_idкампания бонуса начисления или списания
is_statusпризнак статусности бонуса начисления или списания
oper_typeтип чека привязанного к бонусу начисления или списания. 1 = продажа, 2 = возврат
chequeitem_idидентификатор позиции чека бонуса начисления или списания
article_idартикул позиции чека бонуса начисления или списания
ea_ciРА позиции чека бонуса начисления или списания. Массив кортежей (ключ, значение)
cheque_idидентификатор чека бонуса начисления или списания
shop_idидентификатор магазина чека бонуса начисления или списания
card_idидентификатор карты бонуса начисления или списания
is_orderпризнак заказа (холдирования) бонуса начисления или списания
source_tableТаблица источник
parent_idID типа баллов
credit_bonus_idID бонуса списания
dt_start_dateДата и время начала действия бонусов ( в секундах) системное поле
d_start_dateДата начала действия бонуса  системное поле
dt_finish_dateДата и время окончания действия бонусов ( в секундах) системное поле
d_finish_dateДата окончания действия бонуса  системное поле
RemainderАктивная порция бонусов (кол-во)
dt_loadДата/время последней обработки записи в DWH
cheque_summСумма чека
cheque_summdiscountedСумма чека со скидкой
ci_quantityКоличество товаров
ci_summСумма позиций в копейках
ci_summdiscountedСумма позиций со скидкой в копейках

Файл coupons_дата_время.csv.gz

Таблица отображает структуру файла и описание данных по купонам, подлежащих инкрементальной выгрузке в S3.

ПолеОписание
coupon_idидентификатор купона
cu_pbдата начала действия купона
cu_peдата окончания действия купона
cu_created_dдата создания купона
is_activeпризнак активности купона - одноименное поле из лояльности
is_on_bonusпризнак покупки за бонусы - одноименное поле из лояльности
offer_rule_idидентификатор правила предложения
charge_rule_idидентификатор правила начисления
charge_rule_nameназвание правила начисления
emission_task_idидентификатор задания на выпуска купона
emission_task_nameназвание задания на выпуск купона
scheduled_task_idидентификатор задания по расписанию
scheduled_task_nameназвание задания по расписанию
emission_idидентификатор выпуска купона
emission_nameназвание выпуска купона
maskназвание маски
cu_type_nameназвание типа купона
cu_numberномер купона
cu_stateидентификатор статуса купона
cu_state_nameназвание статуса купона
cheque_idидентификатор чека гашения купона
createdon_ch_idидентификатор чека выпуска купона
ch_dдата чека гашения купона
ch_numberномер чека гашения купона
ch_campaign_idидентификатор кампании чека гашения
ch_summсумма чека гашения в копейках
ch_summdсумма чека гашения со скидкой в копейках
ch_orgunit_idидентификатор магазина гашения купона
ch_pos_idидентификатор терминала гашения купона
ch_card_idидентификатор карты лояльности из чека гашения
cu_card_idидентификатор карты лояльности из купона
cu_contact_idидентификатор контакта из купона
campaign_nameназвание кампании
cu_is_delпризнак удаления купона
ch_is_delпризнак удаления чека гашения
template_nameНазвание шаблона
bonus_paidСтоимость купона
cu_cancellation_dtДата и время гашения купона (не из чека)
cu_orgunit_idID магазина выпуска купона
dt_loadдата загрузки строки в витрину (дефолтное значение)
bonus_status_typeТип бонусов (статусные и бонусные)
benefit_typeТип бенефита
benefit_valueЗначение бенефита

Интеграция

Для обеспечения выгрузки файлов в S3 стоит установить интеграцию аналитической СУБД Manzana с бакетом S3.

Роли доступа

Для того чтобы иметь возможность вносить изменения в выгрузку данных в S3 для указанных файлов, необходимо иметь одну из указанных ролей доступа:

  • Роль доступа Manzana на запись файлов в бакет S3
  • Роль доступа [Название Заказчика] на просмотр и копирование файлов из бакета S3

Отчетность

Не предполагается построение дополнительной отчётности

Критерии приемки

Однократная сверка данных со стороны Manzana происходит по принципу подтверждения соответствия количества записей в выгруженном файле за заданный период количеству записей, имеющихся в Manzana СУБД.

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

ТаблицаКоличество записей
chequeitemsпозиций чеков/сумма/сумма со скидкой/количество удалений/количество SKU
bonusesзаписей бонусов/сумм бонусов/количество удалений
couponsномерных купонов
contactsконтактов/количество телефонов/количество email с изменениями за заданный период
cardsкарт
campaignsкампаний
rulesправил

Ограничения, предположения и допущения

Файлы хранятся в течение 7 суток с момента размещения файла, затем автоматически удаляются. Это производится встроенными средствами S3 управляемыми настройками бакета. При копировании пользователем с учетной записью на просмотр исходный файл остаётся в бакете до окончания срока хранения.

Вложением ниже приведены скрипты запросов. Они являются примерами и могут быть изменены разработчиком Manzana.

Скрипты запросов на выгрузку данных