дата инженеретта – Telegram
дата инженеретта
2.98K subscribers
242 photos
28 videos
4 files
102 links
мелкое — крупно,
в глубоком разговоре
мудрость приходит

по вопросам сюда: @aigul_sea
Download Telegram
Как уменьшить размер бд?

💿На одном проекте в разгар сезона часто не хватало места на диске, чтобы создать новую базу данных. В таких крайних случаях можно сжать существующие (редко используемые) базы командой:

DBCC SHRINKDATABASE([db_name], 0);  
GO


Диалект - MS SQL Server.
Вторым аргументом указывается процент свободного места для бд в диапазоне 0-100. Чем его больше, тем быстрее происходит вставка данных, есть запас для изменения структуры и наполнения полей и т.д.

➡️Операция сжатия на больших объемах:
- супер долго выполняется
- снижает эффективность индексов и производительность (т.к. под капотом страницы с данными перемещаются)

✏️Но если в бд не пишется много данных или вообще не пишется, а дела с местом на диске прямо критичны, то это как вариант.

#sql_tips
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥61🤔1🤡1
Про SQL Wildcards

Я решила поэкспериментировать с форматом и посмотреть, что из этого выйдет)

Все знают про %, но про остальные я думала, что они существуют в регулярках в программировании, но никак не в эскуэль.

Пока не увидела в коде запросов, например:

--эквивалентны
and Action_Code like 'K[HS]'

and Action_Code = 'KH' or Action_Code = 'KS'

--тоже эквивалентны
and Assignment_Value like '%CRE[12]%'

and Assignment_Value like '%CRE1%' or Assignment_Value like '%CRE2%'


Для любителей почитать вот ссылки на оф. доки:
Postgres
MS SQL Server
MySQL

#sql_tips
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥302👨‍💻2💯1
count(), F.count(), F.countDistinct(), distinct()

В спарке есть несколько функций count, которые меня вначале путали, и тут я хочу расставить все точки над i.

1️⃣ count() - это действие
Оно запустит весь пайплайн расчетов и выведет на экран одно число - количество строк в датафрейме:
df.count()


Также можно использовать в агрегации, но нельзя поменять название столбца (будет count):
df.groupBy('category')
.count()
.orderBy('count')
.show()


2️⃣ F.count() - это трансформация, агрегирующая функция
df.select(F.count('id')).show()


В отличие от первого способа в агрегации можно поменять название столбца:
df.groupBy('category')
.agg(F.count('id').alias('cnt'))
.orderBy('cnt')
.show()


Отличия count() и F.count():
# результат - датафрейм с одной ячейкой
df1.select(F.count('id')).show()
# +---------+
# |count(id)|
# +---------+
# | 3|
# +---------+

# результат - число
df1.select('id').count()
# 3

3️⃣ F.countDistinct() - тоже агрегирующая функция
df.select(F.countDistinct('id')).show()


Тут вариант агрегации только один, потому что df.countDistinct() не существует:
df.groupBy('category')
.agg(F.countDistinct('id'))
.show()


При этом в спарке есть еще функция distinct(), которая тоже вносит некую путаницу.

Отличия distinct().count() и F.countDistinct():
# результат - датафрейм с одной ячейкой
df1.select(F.countDistinct('id')).show()
# +------------------+
# |count(DISTINCT id)|
# +------------------+
# | 2|
# +------------------+

# результат - число
df1.select('id').distinct().count()
# 2


#spark
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥5🌚1
Как из деления int/int получить double?

🤓Вам нужно что-то посчитать: поделить одно количество на другое и округлить результат до 2х знаков после запятой.

Так как количество - это целое число, если написать просто count1/count2, то в результате мы получим тоже целое число: 15/26 = 0. А мы хотим 0.57692307692307692308 - вот оно самое.

Поэтому умножаем на 1.0, и вуаля
SELECT round(count1 * 1.0 / count2, 2)
FROM test


#sql_tips
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥123🌚2
День демо

Сегодня у нас прошло очередное демо трайба!

🏫Вкратце о структуре

Команда
➡️ Кластер ➡️ Трайб

В кластере несколько команд, а в трайбе несколько кластеров (всего где-то 15 команд +-).

Что было?

🎙Спикеры из команд рассказывали про итоги первого квартала 2024 года, какие мы молодцы, что получилось, что не получилось, какие планы на следующие периоды. Кейсы, графики и цифры, Цифры, ЦИФРЫ...

⌨️В перерыве работали тестовые стенды, где можно было сходить к нашим коллегам, пощупать их продукты и понять, чем они вообще занимаются)

Ну, и вкусный фуршетик🍿
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥123😁2🆒1
👍Полезные советы

В продолжение поста про
вредные советы есть еще несколько лайфхаков (уже нормальных!):

1️⃣ Бывает полезно сделать такое форматирование, когда мы играемся с полями, чтобы удобнее закомментить ненужные:
SELECT 
e.emp_no
, e.first_name
--, e.last_name
, s.salary
FROM employees e
JOIN salaries s
ON e.emp_no = s.emp_no


2️⃣ Добавлять элиасы таблиц к полям (sql или spark - неважно), чтобы под конец огромного запроса понимать, откуда тянутся данные. То же самое 👆на спарке:
final_df = (
employees.alias('e')
.join(salaries.alias('s'), F.col('e.emp_no') == F.col('s.emp_no'), 'inner')
.select(
'e.emp_no',
'e.first_name',
's.salary'
)
)


3️⃣ А когда мы играемся с условиями, я частенько добавляю 1=1, чтобы тоже быстро закомментить и прогнать:
SELECT *
FROM employees
WHERE 1=1
--AND date_joined <= '2024-01-01'
AND is_deleted = 0
AND username != 'system'

Если бы WHERE date_joined <= '2024-01-01' шло на первом месте, то пришлось бы убирать AND перед вторым условием, удалять лишние пробелы - в общем, неудобно, если часто так делать.

#sql_tips #spark
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👏4💯2
Задачка

Есть 3 таблички:

1️⃣ Cities (id, city, region)
2️⃣ Couriers (id, fio)
3️⃣ Orders (id, datetime, cost, city_id, courier_id)

Найти топ 10 курьеров для каждого города, которые доставили больше всего заказов за март.
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥2