Наливать-то будешь?
Чувствуете, что-то я пропустил? Вроде бы обещал данные из SQL Server в Vertica переливать, и тут взял и съехал с темы, негодяй!
Злодеяние это было намеренным, я просто обязан был расшифровать вам кое-какую терминологию. Теперь можно ехать дальше.
План у нас был такой:
- Присваивать заливкам номера сессий
- Забрать данные из SQL Server
- Положить данные в Vertica
- Собрать статистику
Итак, чтобы всё это запустить, я сделал маленькое дополнение к нашему docker-compose.yml:
Там мы поднимаем:
Запускаем всё добро с помощью чуть более сложной, чем в прошлый раз, команды:
$ docker-compose -f docker-compose.yml -f docker-compose.db.yml up --scale worker=3
Что нагенерировал наш чудорандомайзер, можно, воспользовавшись пунктом Data Profiling/Ad Hoc Query:
Главное, не показывать это аналитикам
Подробно останавливаться на ETL-сессиях я не буду, там всё тривиально: делаем базу, в ней табличку, оборачиваем всё менеджером контекста, и теперь делаем так:
with Session(task_name) as session:
print('Load', session.id, 'started')
# Load worflow
...
session.successful = True
session.loaded_rows = 15
from sys import stderr
class Session:
"""ETL workflow session
Example:
with Session(task_name) as session:
print(session.id)
session.successful = True
session.loaded_rows = 15
session.comment = 'Well done'
"""
def __init__(self, connection, task_name):
self.connection = connection
self.connection.autocommit = True
self._task_name = task_name
self._id = None
self.loaded_rows = None
self.successful = None
self.comment = None
def __enter__(self):
return self.open()
def __exit__(self, exc_type, exc_val, exc_tb):
if any(exc_type, exc_val, exc_tb):
self.successful = False
self.comment = f'{exc_type}: {exc_val}n{exc_tb}'
print(exc_type, exc_val, exc_tb, file=stderr)
self.close()
def __repr__(self):
return (f'<{self.__class__.__name__} '
f'id={self.id} '
f'task_name="{self.task_name}">')
@property
def task_name(self):
return self._task_name
@property
def id(self):
return self._id
def _execute(self, query, *args):
with self.connection.cursor() as cursor:
cursor.execute(query, args)
return cursor.fetchone()[0]
def _create(self):
query = """
CREATE TABLE IF NOT EXISTS sessions (
id SERIAL NOT NULL PRIMARY KEY,
task_name VARCHAR(200) NOT NULL,
started TIMESTAMPTZ NOT NULL DEFAULT current_timestamp,
finished TIMESTAMPTZ DEFAULT current_timestamp,
successful BOOL,
loaded_rows INT,
comment VARCHAR(500)
);
"""
self._execute(query)
def open(self):
query = """
INSERT INTO sessions (task_name, finished)
VALUES (%s, NULL)
RETURNING id;
"""
self._id = self._execute(query, self.task_name)
print(self, 'opened')
return self
def close(self):
if not self._id:
raise SessionClosedError('Session is not open')
query = """
UPDATE sessions
SET
finished = DEFAULT,
successful = %s,
loaded_rows = %s,
comment = %s
WHERE
id = %s
RETURNING id;
"""
self._execute(query, self.successful, self.loaded_rows,
self.comment, self.id)
print(self, 'closed',
', successful: ', self.successful,
', Loaded: ', self.loaded_rows,
', comment:', self.comment)
class SessionError(Exception):
pass
class SessionClosedError(SessionError):
pass
Настала пора забрать наши данные из наших полутора сотен таблиц. Сделаем это с помощью очень незатейливых строчек:
source_conn = MsSqlHook(mssql_conn_id=src_conn_id, schema=src_schema).get_conn()
query = f"""
SELECT
id, start_time, end_time, type, data
FROM dbo.Orders
WHERE
CONVERT(DATE, start_time) = '{dt}'
"""
df = pd.read_sql_query(query, source_conn)
- С помощью хука получим из Airflow
pymssql
-коннект - В запрос подставим ограничение в виде даты — в функцию её подбросит шаблонизатор.
- Скармливаем наш запрос
pandas
, который достанет для насDataFrame
— он нам пригодится в дальнейшем.
Я использую подстановку {dt}
вместо параметра запроса %s
не потому, что я злобный Буратино, а потому что pandas
не может совладать с pymssql
и подсовывает последнему params: List
, хотя тот очень хочет tuple
.
Также обратите внимание, что разработчик pymssql
решил больше его не поддерживать, и самое время съехать на pyodbc
.
Посмотрим, чем Airflow нашпиговал аргументы наших функций:
Если данных не оказалось, то продолжать смысла нет. Но считать заливку успешной тоже странно. Но это и не ошибка. А-а-а, что делать?! А вот что:
if df.empty:
raise AirflowSkipException('No rows to load')
AirflowSkipException скажет Airflow, что ошибки, собственно нет, а таск мы пропускаем. В интерфейсе будет не зеленый и не красный квадратик, а цвета pink.
Подбросим нашим данным несколько колонок:
df['etl_source'] = src_schema
df['etl_id'] = session.id
df['hash_id'] = hash_pandas_object(df[['etl_source', 'id']])
А именно:
Остался предпоследний шаг: залить всё в Vertica. А, как ни странно, один из самых
эффектных
эффективных способов сделать это — через CSV!
# Export data to CSV buffer
buffer = StringIO()
df.to_csv(buffer,
index=False, sep='|', na_rep='NUL', quoting=csv.QUOTE_MINIMAL,
header=False, float_format='%.8f', doublequote=False, escapechar='\')
buffer.seek(0)
# Push CSV
target_conn = VerticaHook(vertica_conn_id=target_conn_id).get_conn()
copy_stmt = f"""
COPY {target_table}({df.columns.to_list()})
FROM STDIN
DELIMITER '|'
ENCLOSED '"'
ABORT ON ERROR
NULL 'NUL'
"""
cursor = target_conn.cursor()
cursor.copy(copy_stmt, buffer)
- Мы делаем спецприёмник
StringIO
. pandas
любезно сложит в него нашDataFrame
в видеCSV
-строк.- Откроем соединение к нашей любимой Vertica хуком.
- А теперь с помощью
copy()
отправим наши данные прямо в Вертику!
Из драйвера заберем, сколько строчек засыпалось, и скажем менеджеру сессии, что всё ОК:
session.loaded_rows = cursor.rowcount
session.successful = True
Вот и всё.
На проде мы создаем целевую табличку вручную. Здесь же я позволил себе небольшой автомат:
create_schema_query = f'CREATE SCHEMA IF NOT EXISTS {target_schema};'
create_table_query = f"""
CREATE TABLE IF NOT EXISTS {target_schema}.{target_table} (
id INT,
start_time TIMESTAMP,
end_time TIMESTAMP,
type INT,
data VARCHAR(32),
etl_source VARCHAR(200),
etl_id INT,
hash_id INT PRIMARY KEY
);"""
create_table = VerticaOperator(
task_id='create_target',
sql=[create_schema_query,
create_table_query],
vertica_conn_id=target_conn_id,
task_concurrency=1,
dag=dag)
Я с помощью VerticaOperator()
создаю схему БД и таблицу (если их еще нет, естественно). Главное, правильно расставить зависимости:
Читать
• готов тратить на вас свое бесценное время;
• почти всегда готов купить то, что его устроит.
И все это клиент сделал до того, как узнал, что у него есть проблемы со знанием вашего продукта.
Конечно, клиент не знает продукт. И это – барьер. Барьер следует убрать. Это всего лишь одна из многих стандартных сложностей.
Самые главные потребности/проблемы клиента появились задолго до того, как он обратился к вам!
Клиент либо верит, что с помощью вашего продукта он решит свои задачи, либо не верит. И если верит, то покупает. А если не верит, то «нет времени», «может быть, позже», «руководство не согласовало», «Иван Иванович в командировке», «слишком дорого» и т. д.
Менеджер по продажам может или перейти на поле бизнес-проблем клиента, или не перейти. И если менеджер сосредоточится только на функционале, то клиенту придется продавать себе самому. А заодно и продавать своим коллегам. Далеко не каждый клиент готов заниматься работой, плату за которую получит другой человек. Может быть, вы сами готовы?
• Решение не поможет в принципе.
• Сотрудники клиента не будут им пользоваться.
• Клиент окажется в трудную минуту без поддержки своего менеджера.
А это потери времени и денег. Что вы сказали и сделали, чтобы нивелировать эти риски? Обсуждение одних лишь характеристик мало помогает. При этом клиент может у вас ничего особенного не спрашивать, справедливо полагая, что на сложные вопросы вы не ответите.
И еще один важный момент. Что лучше всего вы знаете: аспекты бизнеса по основным видам деятельности или функциональность вашего продукта? Я думаю, ответ очевиден. Поэтому многие продавцы продают именно функциональность. Но это не продажи, и, как следствие, вы зарабатываете мало. А что нужно, чтобы зарабатывать много? Слушать, читать, спрашивать и думать. И хоть немного знать психологию людей.
Глава написана Николаем Ивановым.
Всех людей можно разделить на четыре типа личности, об этом мы и хотим рассказать. Прежде всего необходимо ответить на вопрос: какую полезную информацию можно из этого деления извлечь? Научившись распознавать эти четыре типа, вы сможете лучше понимать мотивы людей, а само общение станет значительно проще. Вы будете знать, чего клиенты хотят, чего боятся, как к ним подступиться, что им предлагать и как приходить к общему знаменателю.
Меня заинтересовало мнение Ольги Ягудиной, тренера по продажам из Санкт-Петербурга, члена Санкт-Петербургского cоюза предпринимателей. Она классифицировала психотипы так:
• аналитик;
• драйвер;
• дружелюбный;
• экспрессивный.
Рассмотрим каждый психотип более подробно.
Особенность аналитиков – стремление вникать в детали, разбираться в узконаправленных сферах, следовать логическому мышлению. Спокойные, часто флегматичные, они незаменимые командные игроки.
Вспоминается случай, когда мой знакомый на полном серьезе сделал таблицу в Excel, где с помощью графиков сравнил два числа – 2 и 5. Этим он хотел показать, что при выполнении определенной задачи мы отстали от своих коллег более чем в два раза.
Как определить аналитиков? Внешне эти люди консервативны: строгий костюм, идеальные стрелки на брюках, начищенные ботинки, аккуратная прическа, чисто выбритое лицо.
Аналитики, как правило, интроверты. Стараются избегать общества и сосредотачиваются на собственных умозаключениях. Следуют логике, поэтому предпочитают осмысленные решения и не поддаются эмоциональным всплескам. У них всегда присутствует холодный расчет, при этом они предельно ответственны. Если аналитик берется за решение какой-либо задачи, то обязательно доведет дело до конца. Он не позволит себе схалтурить, пропустить, не заметить деталей. Именно такая проницательность и позволяет аналитикам получать более высокие результаты при равных условиях соперничества. Но есть и другая сторона – эти люди, как правило, одиноки. Ценят дружеские отношения, но друзей отбирают тщательно. Можно сделать вывод, что аналитикам хорошо в своем обществе, редкий человек способен завоевать их расположение и вызвать желание постоянно общаться. Ваш покорный слуга как раз из таких (отчасти).
Чтобы продать услугу таким клиентам, необходимо четко аргументировать положительные стороны продукта. При проведении презентации делайте ставку на логику, а не на эмоции. Будьте готовы к тому, что вам будут задавать много вопросов. Закрывая сделку, действуйте настойчиво, но не агрессивно, предоставьте время на принятие решения.
Моя карьера в продажах программного обеспечения для бизнеса началась в 2006 году. Именно тогда я начал продавать систему для отправки отчетности в контролирующие органы СБиС. В тот период мне довелось много работать с бухгалтерами – они в большинстве своем принадлежат к психотипу аналитиков. Склонить такого клиента на свою сторону часто достаточно сложно. Но если вам это удалось, будьте уверены – вы получили отличного клиента на всю жизнь.
Какие страхи есть у аналитиков? Если проследить за их поведением, станет ясно, что они испытывают антипатию к любому проявлению хаоса, бардака, отсутствию структуры. Они перфекционисты, поэтому ценят грамотность, аккуратность, полностью подчиненное логике соотношение вещей. Такие люди часто находят себя в профессиях, связанных с наукой, финансами и программированием. То есть там, где нужна скрупулезность, где требуется постоянно обучаться и концентрировать внимание. Эти люди избегают больших и шумных компаний, редко посещают всевозможные симпозиумы и семинары. Среда аналитиков – это спокойное, уединенное место, где можно полностью сосредоточиться на собственных мыслях.
Вы когда-нибудь были на семинаре для бухгалтеров? Если в зал, рассчитанный на 100 человек, придет всего 10, они рассредоточатся по всему помещению.
Аналитики боятся ошибок, поскольку убеждены, что если они что-то делают, то должны делать это со 100 %-ной ответственностью и на 100 % правильно.
Чтобы заинтересовать аналитика своим продуктом, необходимо говорить о фактах и неоспоримых преимуществах: «Продукт проверен временем – он надежен. Стабильность работы серверов – 99,9 %. Продукт используют такие компании, как Х, Y, Z, на сайте вы можете прочесть отзывы. Внедрив этот продукт в своей компании, вы наведете там полный порядок. Все будет разложено по полочкам, рутинные операции будут автоматизированы». И так далее в том же ключе.
Среди драйверов часто встречаются руководители и директора. Название «драйверы» говорит само за себя. Они постоянно проявляют инициативу, предпочитают действовать и командовать. Эти люди прекрасно подходят для задействования в организационных процессах, а также быстро принимают решения. Драйверы не любят тратить много времени на раздумья, предпочитая повиноваться собственному мнению и от него не отступать. Даже если было принято неверное решение, они все равно не станут вас слушать. Как правило, люди, относящиеся к данному психотипу, считают себя умными, они самоуверенны (привет моему старшему брату Михаилу!). В большей или меньшей степени именно такой подход и приносит им значительный успех в обществе.
Разговор с драйвером может быть не самым приятным. Причина заключается в настойчивости и конкретности таких людей. Если вы сказали: «Сделаю», значит, должны сделать. Неважно при этом, умерла ваша любимая кошка или сами вы заболели, – эти вопросы второстепенные. Манера вести разговор у драйверов своеобразная: речь громкая, фразы короткие и четко произнесенные.
§
Наш Санкт-Петербургский Союз предпринимателей – одна из самых массовых организаций деловых людей Санкт-Петербурга – уже более 27 лет помогает состоящим в наших рядах предприятиям малого и среднего бизнеса успешно развивать свое дело, представляя и защищая, если требуется, их интересы в органах законодательной и исполнительной власти, активно ведет подготовку, переподготовку предпринимательских кадров. И книга, которую вы держите в руках, послужит вам учебным пособием, научит, как эффективней, «на результат» вести деловой диалог с партнерами.
Я знаю, что идея книги возникла давно и не случайно. Со временем концепция претерпела ряд изменений, в итоге получился актуальный для аудитории и, что немаловажно, хорошо систематизированный сборник ценных методик и идей, которые помогут совершенствовать как бизнес, так и личную карьеру.
Вся наша жизнь состоит из общения, поэтому навык коммуникации – ключевой в достижении успеха. Если вы умеете эффективно строить общение, то достигать своих целей будете быстрее.
Каждый день люди допускают ошибки коммуникации. Неумелые продавцы безрезультатно пытаются убедить купить товары и услуги. Некоторые стараются привлечь покупателей скидками, не играющими, в принципе, большой роли. В офисе общение тоже важно, ведь отсутствие понимания в коллективе приводит к хаосу и несогласованной работе. Примеров множество, их можно приводить бесконечно.
В этой книге мы расскажем о частых ошибках в процессе коммуникации, которые снижают ее эффективность, и поделимся знаниями, как их исправить. Вы узнаете о том, как правильно построенное общение способствует быстрому достижению целей. Приведенные правила и методы общения просты для понимания, однако для их внедрения придется потрудиться.
Книг по коммуникациям много. Но, как правило, в каждой из них описывается какая-то одна ключевая идея. Мы решили собрать в нашей книге все самое ценное, что поможет вам лучше понимать людей, их потребности и страхи. Эти советы помогают достигать успеха нам самим, помогут и вам. Самое главное – советы просты для понимания и вы сможете применить их незамедлительно.
В книге большое количество материала, который вы не найдете в печатном виде. Это и наш собственный опыт, и советы экспертов в области коммуникации.
1. Читайте вдумчиво, не пробегайте глазами текст. Эта книга нужна вам для практического применения. Возьмите лист А4, напишите заголовок «На внедрение» и записывайте идеи, которые начнете реализовывать прямо сейчас. Именно действия помогут вам продвинуться вперед.
2. Делайте пометки на полях, закладки в электронной книге, чтобы возвращаться к важным частям в случае необходимости.
3. Перечитывайте эту книгу хотя бы раз в месяц. Используйте ее как учебное пособие, которое помогает вам общаться успешно.
4. Проверяйте каждую неделю, каких успехов вы добились. Задавайте себе вопросы о провалах и ошибках, улучшениях, уроках, которые вы извлекли.
5. Ведите записи о проделанной работе и достигнутых результатах. Ничто так не мотивирует, как изучение прошлых достижений!
А теперь за дело!
«Узнайте, что нужно людям, и дайте им это» – вот главный принцип эффективных коммуникаций, проверенный на практике (но его мало кто соблюдает!). Гораздо удобнее и проще делать то, что нужно нам самим.
Рассмотрим пример. Вы продаете сложный продукт или услугу потенциальному клиенту. Наверняка у вас часто возникают две ситуации:
• клиент не знает, чего он на самом деле хочет;
• клиент частично обманывает. Чаще всего – неосознанно.
Мы не должны ловить за руку клиента и доказывать тому, что он не прав. Не надо создавать у него комплекс вины. Не надо спорить. Все это отталкивает, и в результате не прав менеджер по продажам. Потому что менеджер по продажам прав только в одном случае: когда он продал и получил неплохую комиссию. Клиенту всегда нужен результат. А процесс может быть описан и сконструирован на практике разными способами. Возможно, что совсем не так, как вроде бы «хотел» клиент.
От результатов нашей работы клиент должен испытывать не чувство удовлетворения, а удовольствие! Чем для вас удовлетворение отличается от удовольствия? Отталкивайтесь от этого понимания при работе с покупателями. Если клиент чувствует радость от общения с вами, то он будет готов прощать вам многие вещи, в том числе отсутствие некоторых функциональных возможностей вашего продукта или услуги.
Важно, чтобы клиент чувствовал себя правым не только потому, что решение, которое он захотел купить, работает, но и потому, что он правильно поступил, выбрав именно вашу компанию.
Рассказывает Николай Иванов
Однажды я настраивал систему «Мегаплан» в компании «Форполимер» (Санкт-Петербург). После выполнения работы попросил директора компании Владимира Дубко дать короткий отзыв о моей работе. Вот его слова: «Скажу честно, что не очень люблю обращаться к аутсорсинговым компаниям, поскольку обычно на объяснение того, что тебе нужно, требуется много времени и сил. Ведь для написания грамотного технического задания нужно знать 80 % того, что знает исполнитель. Однако работа с Николаем меня приятно удивила. Во-первых, Николай умеет слушать и слышать. Он четко услышал задачу и грамотно структурировал ее. Во-вторых, на встрече мы достигли договоренностей о сроках и цене работы. А самое главное – реализация заняла минимальное время. Более того, Николай работал на моем компьютере, объясняя каждый шаг. И последующие мелкие коррективы мне удалось внести без труда».
Мораль: с пониманием относитесь к попыткам клиента объяснить, что же ему от вас нужно. Не судите строго, если вы поймете, что клиент вас обманул. Люди часто обманывают, путаются в мыслях, ошибаются, говорят не то, что думают. Но как часто вы прощали это самим себе и как часто другим? Очень просто сказать, что «мне надоело, клиент такой-сякой». Но это слабость.
Если вы не сможете ничего изменить для этого клиента в лучшую сторону, то и для вас ничего не изменится. Например, зарплата не вырастет. Может ли менеджер по продажам называть себя профессионалом и думать о себе хорошо, если его доход стабильно невысок и не растет долгое время?
Ваша цель – не самоутвердиться за счет клиента, не пожаловаться на несправедливость и обстоятельства. Ваша цель – заработать денег для компании и для себя. А у лучших менеджеров еще цель – помочь другим людям (своим клиентам). Посмотрите на коллег, которые зарабатывают больше вас. Как у них обстоят дела с клиентской лояльностью и терпимостью? Что они называют целью своей работы? И сравните их с собой. Возможно, вы увидите что-то, что мешает вам заработать больше денег.
«Добрый день, это Иван, Вам удобно разговаривать? Вы смотрели наше решение, есть ли у вас вопросы по функционалу?» Знакомые фразы? Вы знаете, о чем вы спрашиваете? Ответ простой: ни о чем.
Контакт должен быть сосредоточен на основных проблемах клиента. Вы думаете, что проблемы клиентов заключаются в незнании всех фишек вашего товара или услуги? Если вы говорите с клиентом, это значит, что он:
• пришел к вам;
• оставил свою контактную информацию;