Comments 4
Вопрос не подкреплялся подходящим датасетом, поэтому я нашел массив данных на портале Kaggle. В нем 541909 записей, 25900 уникальных чеков и 4070 разных кодов товаров. Вы можете взять любой датасет
И Вы не нашли ничего лучше, чем последовать за авторами вопроса и точно так же оставить читателя без массива данных для воспроизведения написанного?
Забегая вперед, хочу сказать, что это лучшее время по сравнению с другими вариантами.
Ничего не могу сказать ни про Питон, ни про Спарк. Но вот SQL-вариант... он ужасен. И неудивительно, что он проиграл (справедливости ради следует отметить - не так уж и много) варианту на питоне. Хотя какие-то вшивые полмиллиона записей, без какой-либо обработки - да при правильно построенном запросе должно было уделать питоновский вариант приблизительно на порядок (да-да, не в два раза, и не в три - на порядок), даже при отсутствии подходящих индексов.
В Spark переходя на python вы попадаете как минимум на сериализацию/десериализацию данных. По сути вы получили скорость работы локального Python скрипта + время поднятия/запуска spark job.
Spark вообще c local[*] имеет смысл запускать только для целей отладки. Spark это не локальная утилита для расчетов. Он про распределенные вычисления на кластерах и большие массивы данных. Так же там нужно озаботиться правильным шардированием данных по нодам, чтобы соблюдать data locality и избегать shuffle.
Это как взять камаз для доставки спичечного коробка по высокоскоростной магистрали. Да, легковушка довезет быстрее. Вот только если вам этих спичек нужно будет привезти тонну, производительность камаза даже с его 80км/ч будет гораздо выше.
В части SQL полная ахинея.
SELECT sc1, sc2, Count(*) as kol FROM
(
SELECT a.invoiceno, a.stockcode as sc1, b.stockcode as SC2
FROM sales a JOIN sales b ON a.invoiceno=b.invoiceno AND a.stockcode < b.stockcode
GROUP BY a.invoiceno, a.stockcode, b.stockcode
) AA
GROUP BY sc1, sc2
ORDER BY kol DESC
При соответствующих индексах на такой выборке будет около секунды
Подсчет количества пар товаров в продуктовых чеках с помощью трех инструментов: Python, Spark, SQL