У меня возникли проблемы с кодированием в scala (это мой первый раз), я строю базовую c систему рекомендаций для предметов для моего набора данных. После различных этапов обработки данных, в настоящее время у меня есть искровой фрейм данных со следующей схемой:
root
|-- product_id: integer (nullable = true)
|-- order_id: integer (nullable = true)
|-- user_id: integer (nullable = true)
, и это пример данных в моем фрейме данных:
+-------+----------+--------+
|user_id|product_id|order_id|
+-------+----------+--------+
| 205022| 1401| 1871854|
| 2502| 1401| 3409991|
| 140656| 1401| 2801756|
| 201432| 1401| 138557|
| 201432| 1401| 1337880|
| 164682| 1401| 147805|
| 34938| 1402| 2757722|
| 201432| 1402| 222168|
| 201432| 1403| 2896873|
| 150340| 1401| 383874|
+-------+----------+--------+
Для начала, Я хочу построить матрицу элемент-элемент из приведенного выше фрейма данных так, чтобы row_index были prouct_id
, а индекс столбца также был prouct_id
, значения - это счетчик количества покупок продукта в строке вместе с соответствующим продуктом в столбец.
Сначала я подумал о простом groupby для product_id и повороте product_id с агрегатной функцией в виде count (), что-то вроде этого:
val itemItemDf = filteredDF.groupBy("product_id").pivot("product_id").count()
, но Я понял, что это неправильный подход, он не подсчитывает, сколько раз каждый предмет покупается вместе с другим предметом. Это только дает мне полную покупку каждого продукта. Другая идея состояла в том, чтобы провести l oop по всему набору данных, но я хочу избежать зацикливания, поскольку это большой набор данных с более чем 3 миллионами записей. Я надеюсь, что есть более простой способ сделать это, используя встроенные функции искры.
Я застрял и не знаю, как двигаться вперед, любая помощь (или указание в правильном направлении) будет высоко ценится .