Я работаю с искровым DataFrame и хочу преобразовать его в CoordinateMatrix.
CoordinateMatrix принимает: MatrixEntry(i,j,value)
, где i, j типа int .
Принимая во внимание, что поля данных имеют тип string, поэтому мне нужно создать карту, которая преобразует идентификатор столбца в индекс.
#just to create a sample
arr = np.array([
['b5ad805c-f295-4852-82fc-961a88',12732936],
['0FD6955D-484C-4FC8-8C3F-DA7D28','Gklb38'],
['0E3D17EA-BEEF-4931-8104',12909841],
['CC2877D0-A15C-4C0A-AD65-762A35C1','12645715'],
['CC2877D0-A15C-4C0A-AD65-762A35C1',12909837],
['6AC9C45D-A891-4BEA-92B1-04224E9C65ED', '12894376'],
['CFF7BAB7-C5E1-490D-B257-AE58CA071362', 'Gklb38' ]])
df_purchases = pd.DataFrame(arr, columns = ['user_id','basket'])
Преобразовать в искровой фрейм данных:
df_spark = spark.createDataFrame(df_purchases)
df_spark.show()
Пример вывода:
![enter image description here](https://i.stack.imgur.com/Xx5d3.png)
Я думал об использовании
indexedDF = df.rdd.zipWithIndex()
, а затем создать карту ... но тогда я не знал, как ее создать, так как я хочу иметь 2 карты: - user_ids map и productIds map
Карты позволят мне возвращать истинные идентификаторы productIds всякий раз, когда я заканчиваю матричные вычисления (вычисление сходства между продуктами), чтобы узнать, какие продукты являются наиболее похожими для каждого productId.
Есть ли предложения по созданию этих (index, id) карт?
Чтобы лучше проиллюстрировать, здесь кое-что я попробовал, но не мог понять, как иметь обе карты, и не получая в случае, когда один и тот же идентификатор имеет более одного индекса.
Я могу создать карту для indexedDF
:
mappedInd = indexedDF.map(lambda (key,index):key.user_id).collect()
, что позволяет мне позже, когда это необходимо, получить user_id, соответствующий индексу, используя filter()
.
Исходя из этого примера, мой ожидаемый результат:
mappedUsers: map (user_id, index) => user_id, где индекс типа int.
mappedProducts: map (корзина, индекс) => корзина, где индекс типа int.