将RDD从数组数组重塑为pySpark中的唯一列

时间:2018-09-26 10:22:29

标签: pyspark rdd transformation

我想使用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)    

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')