Недавно нужно было наколхозить...

Posted on Tue 04 October 2022 • Tagged with from_telegram, in_russian

Недавно нужно было наколхозить простую тулзу для поиска семплов в большом датасете. Условно есть 200М семплов, доступных через AWS Athena, и к ним делаются запросы в духе select * from big_table where blah like '%blah%' and foo like '%bar%' limit 10;.

Делать все через Athena очень просто, но медленно (запросы редко занимают меньше 10 секунд) и небесплатно (получалось что-то вроде $0.05 за запрос, некритично, но не приятно). Напрашивается решение с частичным кэшированием: возьмем сабсет на 5% данных, положим его локально и будем обращаться к нему, а если не нашли достаточно семплов в локальном сабсете, тогда уже пойдем в Athena с медленным запросом. На практике оказалось, что 95%+ запросов можно удовлетворить сабсетом, все довольно быстро (до полутора секунды на запрос) и бесплатно.

Так как я ленивый, сперва уложил локальный сабсет в SQLite, чтобы не возиться с поднятием более серьезной базы. В принципе, этого было достаточно, но в познавательных целях решил потрогать DuckDB - это embedded OLAP (т.е. колоночная) SQL база данных. DuckDB ставится через pip install (впрочем, есть поддержка и для других языков), плотно интегрирована с pandas и parquet. Замена SQLite на DuckDB потребовала всего нескольких строк и ускорила поиск почти в два с половиной раза до малозаметных 600 мс.

Жду комментариев, что Настоящий Мужик бы поднял кластер Clickhouse, а не это все.

source