Записки Дата инженера
18 subscribers
10 photos
1 file
12 links
Здравствуйте! Я Дата инженер. Буду писать сюда тому что научился или термины, понятия которые я не знал
Download Telegram
Несколько полезных методов строк:
istitle() - проверка на заголовок
isdigit() - проверка на цифры
isupper() - проверка на на заглавные буквы
islower() - проверка на маленькие буквы
is.alpha() - проверка на любые буквы
is.alnum() - проверка на любые буквы и цифры

Методы строк которые меняют регистры:
lower() - все буквы делает маленькими
upper() - все буквы делает большими
swapcase() - все регистры каждой буквы меняет на противоположную
title() - первую букву каждого слова делает заглавной, остальные буквы маленькими
capitalize() - только у первого слова первая буква будет большой, все остальные маленькие

Методы нахождения:
index() - Метод .index также возвращает индекс первой найденной подстроки, аналогично методу .find
S.find(sub, start, end) - Метод .find возвращает индекс первого слева вхождения строки sub в строке S. Подстрока sub ищется на всем срезе строки S. Но вы можете указать интервал поиска, передав второй и третий аргументы. Метод .find вернет значение -1, если ничего не будет найдено.
rfind() - как find только начинает искать справа буква r - right
S.startswith(prefix, start, end) - Данный метод возвращает True если строка S начинается с последовательности символов prefix (префикса) и False в противном случае. При передаче параметра start проверка начнется именно с этой позиции. Если передать значение end, проверка закончится в этой позиции.
S.endswith(prefix, start, end) - Данный метод возвращает True если строка S заканчивается последовательностью символов prefix (префикса) и False в противном случае. При передаче параметра start проверка начнется именно с этой позиции. Если передать значение end, проверка закончится в этой позиции.

Методы дополнения или для красивого вывод:
s.ljust(width, fillchar) - заполняет справа символами чтобы сдвинуть влево
s.rjust(width, fillchar) - заполняет слева символами чтобы сдвинуть вправо
s.center(width, fillchar) - заполняется слева справа чтобы слово было в центре
Несколько примеров форматирования строк через f-strings
st = 'Hello!'
print(f'{st}')
print(f'{st:-^20}')
print(f'{st:->20}')
print(f'{st:?<20}')
Результаты:
Hello!
-------Hello!-------
--------------Hello!
Hello!??????????????
👍1
Сегодня несколько примеров работы над множествами:
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}

print(set_a & set_b) #intersection - Пересечение множеств
print(set_a | set_b) #union - Объединение множеств
print(set_a - set_b) #difference - разность множеств
print(set_a ^ set_b) #symmetric difference - симметрическая разность множеств
👍1
как прочитать неопределенное кол-во элементов? Ниже приведен один из примеров:
import sys
from sys import stdin
lines = stdin.read().splitlines()
👍1
Чтение файлов
Самый простой способ чтения файла это:

sql
file = open('name_of_file.txt')
print(file.read())

Функция open() в стандартном режиме открывает файл для чтения.

sql
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

Переменная file = _io.TextIOWrapper

Для самого чтения из файла используются следующие функции

- read() - читает с самого начала до конца возвращает целую строку
- readline() - читает одну строку возвращает строку
- readlines() - читает все строки и возвращает list

Если в файле есть русские слова то нужно добавить кодировку

sql
file = open('name_of_file.txt', encoding = 'utf-8')

После открытие и обработки файла нужно файл закрыть file.close(). Но можно об этом не волноваться когда используешь контекстный менеджер with. Пример ниже

sql
with open('name_of_file.txt', encoding='utf-8') as f:
print(f.read())

Есть несколько режимом открытия файла:

- r: открывает файл в режиме «только для чтения». Этот режим применяется по умолчанию для функции open. Чтение файла начинается с начала
- rb: открывает файл в режиме «только для чтения» в двоичном формате и начинает чтение с начала файла. Буква b обозначает слово binary(двоичный). Хотя двоичный формат можно использовать для разных целей, обычно он используется при работе с такими вещами, как изображения, видео и т. д.
- r+: открывает файл для чтения и записи, помещая указатель в начало файла.
- w: открывается в режиме «только для записи». Указатель помещается в начало файла, и это перезапишет любой существующий файл с таким же именем. Он создаст новый файл, если файл с таким именем не существует.
- wb: открывает файл в режиме «только для записи» в двоичном режиме.
- w+: открывает файл для записи и чтения.
- wb+: открывает файл для записи и чтения в двоичном режиме.
- a: открывает файл для добавления к нему новой информации. Указатель помещается в конец файла. Новый файл создается, если файл с таким именем не существует.
- ab: открывает файл для добавления в двоичном режиме.
- a+: открывает файл как для добавления, так и для чтения.
- ab+: открывает файл как для добавления, так и для чтения в двоичном режиме.
👍1
# Lambda Функции

Пример обычной функции и lambda функции (строчной функции, анонимной функции)

python
def func(a):
return a * 2

func = lambda a: a * 2


Не все функции можно превратить в анонимную функцию. Только те которые возвращают. Из-за этого анонимные функции не имеют ключевое слова return. Добавления этого слова приведет к SyntaxError. Так же к этому приведет assert, pass, raise. Нужно отметить что так же не поддерживает аннотации

Можно сразу применить функции в конце внутри скобке написать аргументы

python
>>> (lambda x: x + 1)(2)
3
>>> (lambda x, y: x + y)(2, 3)
5


Однострочные функции удобно использовать в функциях map(), filter(), functools.reduce()

Но иногда нужно видеть грань когда анонимные функции будут наоборот могут снизить читабельность вашего кода. как в примере ниже

python
>>> list(map(lambda x: x.capitalize(), ['cat', 'dog', 'cow']))
['Cat', 'Dog', 'Cow']

>>> [x.capitalize() for x in ['cat', 'dog', 'cow']]
['Cat', 'Dog', 'Cow']

#2 ой пример с filter
>>> even = lambda x: x%2 == 0
>>> list(filter(even, range(11)))
[0, 2, 4, 6, 8, 10]

>>> [x for x in range(11) if x%2 == 0]
[0, 2, 4, 6, 8, 10]


Лучше использовать генераторы списков (list comprehension) чем лямбду
👍1
В следующим примере найдем ключ у которого значения равен максимальному
d = {
'a': 1,
'b': 2,
'c': 5,
'e': 0
}

print(max(d, key=d.get))

Обратите внимание если сделать просто: max(d) -> то это вернет 'e' то есть максимум из ключей
👍1
Most asked SQL interview questions

Hello everyone, recently I've passed SQL interview. And I collected most popular SQL questions and topics which you can encounter. #challengeyourself
-What is SQL? Difference between SQL and NoSql
-Explain the next abbreviations DDL, DML, DCL, TCL
Logical JOINs (FULL, CROSS, LEFT/RIGHT, INNER Joins, USING(), ON)
-Physical joins (hash, nested loops and merge joins)
-Difference between JOIN and UNION
-Normalization (1NF, 2NF, 3NF, BCNF, 4NF, 5NF)
-Aggregation functions (sum(), avg(), min(), max(), GROUP BY, HAVING)
-WINDOW functions or OVER() functions (ROW(), RANK(), DENSE_RANK(), LAG(), LEAD(), PARTITION BY, ORDER BY, ROWS BETWEEN)
-Common table expressions (CTE) and VIEWs
-Indexes and their types (B-tree, hash, GIST, SP-Gist, GIN, BRIN, Clustered and Non-clustered
-Recursion in SQL
-Transactions (ACID, Isolation levels(uncommitted, commited, repeatable, serializable, snapshots))
-Triggers and functions
😍1
Решил возобновить канал. Планы для развитие канала и идеи для постов:
1. Что-угодно связанное с программированием
2. Одна задача по python/sql
3. Идеи/мысли
😍1
Channel name was changed to «Записки Дата инжинера»
Apache Sqoop

Ознакомился Apache Sqoop. Это-проект который сейчас не поддерживается но очень хороший инструмент, где до сих пор используют. Основная задача этого инструмента-это import из РСУБД в Hadoop. Достаточно указать параметры подключение (host, user, password, db) и код sql. Также Sqoop использует инфраструктуру MapReduce для импорта и экспорта данных, что обеспечивает параллельный механизм и отказоустойчивость.

В текущем проекте, где я работаю Dataflow работает поверх Apache Sqoop и помогает импортить as is в Hadoop.

Статьи на Хабре
1. https://habr.com/ru/companies/neoflex/articles/646741/
2. https://habr.com/ru/companies/beeline/articles/679876/
3. https://coderlessons.com/tutorials/bolshie-dannye-i-analitika/uznaite-sqoop/sqoop-kratkoe-rukovodstvo
👍1
Пример импорта на sqoop

sqoop import \
--num-mappers 8 \
--fetch-size 100000 \
-Dmapreduce.task.timeout=0 \
-D mapreduce.map.memory.mb=16384 \
-Doraoop.import.partitions='"SERVICE_FEATURE_MAX"' \
--hcatalog-database customer360_stg \
--hcatalog-table customer_oracle_sqoop \
--connect jdbc:oracle:thin:@//10.31.178.66:1521/ORCL \
--username user \
--password password \
--table DWH.SERVICE_FEATURE \
--drop-and-create-hcatalog-table \
--hcatalog-storage-stanza 'stored as orcfile' \
--direct
👍1
NTILE

Ntile - это функция в sql. Она группирует строки на заданное количество частей.

Допустим поделим наши строки на три части в соответствии с уровнем зарплаты. Тогда SQL-запрос будет выглядеть так:

SELECT *,
NTILE(3) OVER(ORDER BY salary DESC) as backet_id
FROM work


—pyspark—-
w = Window.orderBy(F.desc("salary"))
df.withColumn("bucket_id", F.ntile(3).over(w)).show()
😍1
percentile_approx

percentile_approx - Агрегатная функция возвращает выражение, которое является наименьшим значением в упорядоченной группе (отсортированной от наименьшего к наибольшему) таким образом, что не больше percentile значений expr меньше значения или равно ему. Если percentile является массивом percentile_approx, возвращает приблизительный массив expr процентилей в указанном процентиле.

Параметр accuracy управляет точностью аппроксимации за счет памяти. Более высокое значение точности дает лучшую точность. 1.0/accuracy Это относительная погрешность аппроксимации.

Если DISTINCT задано значение , функция работает только с уникальным набором значений expr .

percentile_approx ( [ALL | DISTINCT ] expr, percentile [, accuracy] ) [FILTER ( WHERE cond ) ]

spark.sql(" SELECT percentile_approx(col, 0.75, 100) FROM VALUES (1), (2), (3), (4), (5), (6), (7) AS tab(col)").show()
😍1
Вопросы на собесе для DE.

У нас есть задача построить витрину данных об интересах абонентов. Интересы абонента разбиваются на 10 категорий. В качестве источников для определения интересов у нас есть следующие:

Информация о посещенных сайтах, о длительности сессии, объеме трафика
Информация о датах и количестве входящих/исходящих смс и их отправителях
Информация об исходящих/входящих звонках.
Разметка сайтов, отправителей смс, номеров телефонов на категории интересов поступает от бизнес-заказчиков в виде excel-файлов по почте, регламент обновления отсутствует.

Необходимо предложить архитектуру, наполнение витрины, а также организовать etl-процесс,
позволяющий как можно быстрее учитывать изменения в источниках данных и новую информацию от бизнес-заказчиков
Узнал интересное про фильтрацию по sysdate в Oracle.

Now  SYSDATE
Tomorow/ next day SYSDATE + 1
Seven days from now SYSDATE + 7
One hour from now SYSDATE + 1/24
Three hours from now SYSDATE + 3/24
An half hour from now SYSDATE + 1/48
10 minutes from now SYSDATE + 10/1440
30 seconds from now SYSDATE + 30/86400
Tomorrow at 12 midnight TRUNC(SYSDATE + 1)
Tomorrow at 8 AM TRUNC(SYSDATE + 1) + 8/24
Next Monday at 12:00 noon NEXT_DAY(TRUNC(SYSDATE), ‘MONDAY’) + 12/24
First day of the month at 12 midnight TRUNC(LAST_DAY(SYSDATE ) + 1)
The next Monday, Wednesday or Friday at 9 a.m TRUNC(LEAST(NEXT_DAY(sysdate,”MONDAY’ ‘ ),NEXT_DAY(sysdate,”WEDNESDAY”), NEXT_DAY(sysdate,”FRIDAY” ))) + (9/24)
1
Следующий пример как добавить час, минуту, секунду и день в sysdate.
select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400, sysdate+1 from dual;
1
Недавно в одном посте увидел, где разработчик указывал свои отрицательные стороны. Одна сторона совпало и со мной. Хотел бы поделиться и также поработать над этим.

Это не перерабатывать

Если приходится работать по вечерам или по выходным - значит что-то пошло не так.

Идея перерабатывать, чтобы получить повышение, а потом восстановить режим - такая же, как и посидеть немного на диете, сбросить пару килограмм, а потом вернуться к сладкому.

Из правила есть исключения - дежурства и дедлайны. Но задача - научиться более эффективно работать в рабочее время без вреда личному времени.
4
Хорошая статья про AQE (Adaptive Query Execution) в Spark

https://www.databricks.com/blog/2020/05/29/adaptive-query-execution-speeding-up-spark-sql-at-runtime.html
🆒1