Изменение формы RDD из массива в уникальные столбцы в pySpark - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу использовать pySpark для реструктуризации своих данных, чтобы я мог использовать их для MLLib моделей, в настоящее время для каждого пользователя у меня есть массив массива в одном столбце, и я хочу преобразовать его в уникальные столбцы с количеством,

Users | column1                  |
user1 | [[name1, 4], [name2, 5]] |
user2 | [[name1, 2], [name3, 1]] |

должно быть преобразовано в:

Users | name1   | name2   | name3   |
user1 | 4.0     | 5.0     | 0.0     |
user2 | 2.0     | 0.0     | 1.0     |

Я придумал метод, который использует циклы, но я ищу способ, который может использовать искру, потому что данные огромны.Не могли бы вы дать мне какие-нибудь советы?Спасибо.

Редактировать: Все уникальные имена должны быть представлены в виде отдельных столбцов с оценкой, соответствующей каждому пользователю.В основном, разреженная матрица.Я сейчас работаю с пандами, и код, который я использую для этого,

data = data.applymap(lambda x: dict(x))    # To convert the array of array into a dictionary
columns = list(data)
for i in columns:
    # For each columns using the dictionary to make a new Series and appending it to the current dataframe
    data = pd.concat([data.drop([i], axis=1), data[i].apply(pd.Series)], axis=1)    

1 Ответ

0 голосов
/ 16 ноября 2018

разобрался с ответом,

import pyspark.sql.functions as F
# First we explode column`, this makes each element as a separate row
df= df.withColumn('column1', F.explode_outer(F.col('column1')))
# Then, seperate out the new column1 into two columns
df = df.withColumn(("column1_seperated"), F.col('column1')[0])
df= df.withColumn("count", F.col(i)['column1'].cast(IntegerType()))
# Then pivot the df
df= df.groupby('Users').pivot("column1_seperated").sum('count')
...