Эффективное создание большой матрицы взаимодействия (от миллиардов до триллионов ячеек). AWS Клей PySpark ETL - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь сводить данные и генерировать матрицу взаимодействия пользователя с элементом для моделирования. Я выполнял это как задание AWS Glue Spark.

В моей выборке 53 000 клиентов купили более 1 000 000 различных товаров. Это приведет к созданию матрицы взаимодействия с ~ 53 миллиардами ячеек для заполнения. Выглядит это так:

clientID  ProductID  Purchased
1         1          1
1         2          1
2         1          1
2         3          1
3         2          1
N.B. Purchased is a tinyint dummy indicating if a customer bought a product. 
There are no rows for when a customer has not purchased.

В настоящее время я использую следующий код:

pivot = df.groupby("clientid").pivot("productid").agg(max("Purchased"))

Теперь я уже разрешил запуск этого задания в течение> 2 дней с 150 узлов (узлы quadcore 16GB) и по-прежнему нечего показать. Это заставляет меня хорошо осознавать стоимость этого, особенно учитывая, что это выборка населения, и в будущем ее нужно будет расширить до более миллиона клиентов.

Может ли кто-нибудь подтвердить, существует ли более эффективный с вычислительной точки зрения способ выполнить вышеуказанное, и объяснить мне это?

Спасибо за любую помощь заранее. Если вам нужна дополнительная информация, дайте мне знать.

1 Ответ

0 голосов
/ 26 мая 2020

Для N строк из clientid будет такое же количество строк из productid. Тогда правильно ли я могу сказать, что для следующего запроса

pivot = df.groupby("clientid").pivot("productid").agg(max("Purchased"))

в отсутствие оптимизации таблица будет , а затем она будет уменьшена в результате операции агрегирования.

Итак, почему бы сначала не выполнить агрегирование (возможно, это больше не может быть max, но, скажем, sum или int(mean()), а затем повернуть? В отсутствие оптимизации это должно иметь значение. Кроме того, мы ничего не можем сделать с таким прямым ходом, кроме огромного поворота.

...