На днях пришлось доставать статистику по списку страниц из ClickHouse. Встретилась с проблемой — из-за длинного условия в WHERE по большому списку база выдавала ошибку лимита запроса.🙅
Что придумала:
🍀 Разбила список страниц на части
🍀 Для каждой части сделала отдельный запрос с OR-условиями
🍀 Всё соединила через pd.concat — получилась единая таблица
Я уже показывала как искать по множеству URL в SQL. Теперь автоматизируем и это.
У нас есть большой список URL-адресов (например, из Excel-файла), и нам нужно найти все посещения этих страниц в нашей базе данных.
Берем тестовые данные и список интересующих нас блогов (как будто вы это выгрузили из excel файлика, который вам прислали коллеги)
В этот раз возьмем для наглядности 4 url, чтобы "красиво" разбить их на две части (по два url в каждой)
blogs_df = pd.DataFrame({'blog_path': ['blog/101', 'blog/102', 'blog/201','blog/103']И запихнем все в ци
chunk_size = 2
loc_list = blogs_df['blog_path'].tolist()
results = []
for i in range(0, len(loc_list), chunk_size):
chunk = loc_list[i:i + chunk_size]
print()
print('chunk - это вот что:', chunk) # посмотрим на эти части
chunk_condition = " OR ".join([f"page_url LIKE '%{path}%'" for path in chunk])
print('запихнули части в like:', chunk_condition)
query = f"""
select page_url,
visitor_id,
visit_date
FROM visits_df
where {chunk_condition}
"""
chunk_result = sqldf(query)
results.append(chunk_result)
# Объединяем результаты из всех частей
final_result = pd.concat(results, ignore_index=True)
print выведет нам при первой итерации:
chunk - это вот что: ['blog/101', 'blog/102']
запихнули части в like: page_url LIKE '%blog/101%' OR page_url LIKE '%blog/102%'
при второй итерации:
chunk - это вот что: ['blog/201', 'blog/103']
запихнули части в like: page_url LIKE '%blog/201%' OR page_url LIKE '%blog/103%'
Ну и выведет финально то, что искали. Смотрим на сгенерированного человечка, пытливо ищущего ответы (радуемся картинке - мозг отдыхает), а потом пеереводим взгляд на вывод кода справа и немного напрягаем мозг 🤪.
