1 of 18

Data Engineer. Лекция 5

  • Лектор: Анатолий Бардуков�
  • tg для связи: @sindb , либо в чате�

Наливайте чай,

приветствуйте друг друга в чате и приготовьтесь хорошо провести время

2 of 18

Про что сегодня �

  • Оценка сложности запроса
  • SCD1 ETL
  • CDC
  • Unix & cron
  • Проект

Наливайте чай,

приветствуйте друг друга в чате и приготовьтесь хорошо провести время

3 of 18

SQLite – локальная система управления базами данных

import sqlite3

conn = sqlite3.connect( "mydatabase.db" ) # или ":memory:" чтобы сохранить в RAM

cursor = conn.cursor()

# Создание таблицы

cursor.execute( "CREATE TABLE testtable ( id int, val text )" )

# Вставляем данные в таблицу

cursor.execute( "INSERT INTO testtable ( id, val ) VALUES ( 1, 'One' ) " )

cursor.execute( "INSERT INTO testtable ( id, val ) VALUES ( 2, 'Two' ) " )

# Сохраняем изменения

conn.commit()

4 of 18

SQLite – локальная система управления базами данных

import sqlite3

conn = sqlite3.connect( "mydatabase.db" ) # или ":memory:" чтобы сохранить в RAM

cursor = conn.cursor()

# Чтение таблицы

sql = "SELECT * FROM testtable"

cursor.execute( sql )

print( cursor.fetchall() ) # или fetchone() если нужно построчно

for row in cursor.execute( "SELECT * FROM testtable" ):

print( row )

5 of 18

SQLite – локальная система управления базами данных

  1. Создайте простую базу данных по предложенной ER-диаграмме. Наполните 2-3 строками каждую таблицу.
  2. Выведите в итоге таблицу, содержащую в себе имя владельца билета, дату поездки и начальную-конечную станции.

Tickets

Rides

TicketID

RideID

Ticket_Date

Ride_Date

Person

From_City

Price

To_City

Ride

6 of 18

Подключение к PostgreSQL

import psycopg2

conn = psycopg2.connect(database = "db",

host = "rc1b-o3ezvcgz5072sgar.mdb.yandexcloud.net",

user = "hseguest",

password = "hsepassword",

port = "6432")

conn.autocommit = False

cursor = conn.cursor()

Необходимо научиться делать три вещи:

  • выполнять SQL код в базе данных;
  • импортировать данные из файла в таблицу базы данных;
  • экспортировать данные из таблицы базы данных в файл.

7 of 18

Выполнение SQL в базе данных

# Выполнение SQL кода в базе данных без возврата результата

cursor.execute( "INSERT INTO public.testtable( id, val ) VALUES ( 1, 'ABC' )" )

conn.commit()

# Выполнение SQL кода в базе данных с возвратом результата

cursor.execute( "SELECT * FROM public.testtable" )

records = cursor.fetchall()

for row in records:

print( row )

# Закрываем соединение

cursor.close()

conn.close()

  • Создайте в схеме public таблицу с двумя атрибутами и вставьте в нее 2-3 строки.
  • Проверьте наполнение через DBeaver или psql.
  • Получите выборку из нее через python и выведите ее на экран.

8 of 18

Change data capture (CDC) – захват данных

Способы отследить происходящие изменения:

  • Отметка времени изменения
  • Числовая последовательность изменения (Oracle SCN, MS SQL LSN)
  • Флаг состояния («готов к захвату»)

  • Триггеры
  • Event processing
  • Сканеры логов

  • Никаких…

9 of 18

Пробуем собрать ETL�на SCD1

10 of 18

План

1. Очистка стейджинговых таблиц

2. Захват данных из источника (измененных с момента последней загрузки) в стейджинг

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

4. Загрузка в приемник "вставок" на источнике (формат SCD1).

5. Обновление в приемнике "обновлений" на источнике (формат SCD1).

6. Удаление в приемнике удаленных в источнике записей (формат SCD1).

7. Обновление метаданных.

8. Фиксация транзакции.

11 of 18

А как же SCD2?

  • Вставка – не изменяется.
  • Обновление атрибутов состоит из двух строк.
  • Удаление – добавление новой строки с DELETED_FLG = 1.

Обновим скрипт до SCD2 на следующем занятии

12 of 18

Система прав

  • Права выдаются на чтение, запись, исполнение.
  • Права назначаются для владельца, группы, всех пользователей
  • Какие права у файла можно посмотреть командой ls -l
  • Формат отображения прав:

rwxrwxrwx = 777 – объект доступен всем для любых действий, опасно

rwxr-xr-x = 755 – наиболее часто встречающаяся комбинация для исполняемых файлов

rw-rw-r-- = 664

rw-r--r-- = 644

r-------- = 400 – не делайте так!

--------- = 000 – и тем более так!

13 of 18

Система прав

Для изменения прав используется команда chmod

chmod [<опции>] <права> <файл>

<права> = <кому><что сделать><какие права>, например u+x, ugo-wx

chmod u+x <файл>

  • Сделайте ваш скрипт исполняемым и запустите его.

14 of 18

Cron

  • Cron – демон для запланированного выполнения заданий по расписанию.

  • Расписание формируется в файле crontab. Есть общесистемное расписание и расписание каждого пользователя. Посмотреть расписание пользователя:

crontab –l

  • Редактировать файл crontab:

EDITOR=nano crontab -e

15 of 18

Cron

  • Формат файла crontab:

* * * * * выполняемая команда

- - - - -

| | | | |

| | | | ----- день недели (0—7) (воскресенье = 0 или 7)

| | | ------- месяц (1—12)

| | --------- день (1—31)

| ----------- час (0—23)

------------- минута (0—59)

  • Совет: используйте сайт crontab.guru для формирования сложных шаблонов.
  • Поставьте ваш скрипт helloworld.sh на автоматическое исполнение через 10 минут от текущего времени. Не забудьте перенаправить вывод в файл.
  • Проверьте через 10 минут что скрипт отработал и файл создался.

16 of 18

Мониторинг и убийство процессов

top – показывает активные процессы и потребляемые ими ресурсы (в виде обновляемой таблицы).

ps – показывает статусы запущенных процессов

ps aux – показывает все процессы, даже отключенные от терминала, выводит имена пользователей

kill [<-signal>] <id процесса> – посылает процессу с указанным идентификатором сигнал

kill <id процесса>

kill -1 <id процесса>

kill -SIGHUP <id процесса>

kill -9 <id процесса>

kill –SIGKILL <id процесса>

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

17 of 18

Клиент psql

mkdir -p ~/.postgresql && \

wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" \

--output-document ~/.postgresql/root.crt && \

chmod 0600 ~/.postgresql/root.crt

psql "host=rc1b-o3ezvcgz5072sgar.mdb.yandexcloud.net \

port=6432 \

sslmode=verify-full \

dbname=db \

user=hseguest \

target_session_attrs=read-write"

  • Выведите в файл riders.txt таблицу велосипедистов из de.cycling, отсортированную по местам.

Атрибуты для вывода: ранг и имя велосипедиста.

18 of 18

Проект!

  • Схема info с измерениями для обогащения данных
  • Данные - 3 дня транзакций надо будет грузить в ваш DWH
  • Необходимо находить мошенничества (4 вида), отчеты раз в день
  • На минимальный балл - SCD1 с одним видом мошенничества
  • Все детали будут в чате
  • Срок - 2 недели
  • Дополнительные баллы за Airflow и аналоги вместо cron