我想使用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 |
我想出了一种用于循环的方法,但是我正在寻找一种可以利用spark的方法,因为数据量很大。你能给我些提示吗?谢谢。
编辑: 所有唯一名称应作为单独的列出现,分数与每个用户相对应。基本上是稀疏矩阵。 我现在正在使用熊猫,我正在使用的代码是
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)
答案 0 :(得分:0)
找出答案,
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')