pyspark使用数据框行号添加新列字段

时间:2016-02-03 10:40:00

标签: python apache-spark pyspark apache-spark-mllib apache-spark-ml

Hy,我正在尝试使用Spark构建推荐系统

我有一个包含用户电子邮件和电影评级的数据框。

df = pd.DataFrame(np.array([["aa@gmail.com",2,3],["aa@gmail.com",5,5],["bb@gmail.com",8,2],["cc@gmail.com",9,3]]), columns=['user','movie','rating'])

sparkdf = sqlContext.createDataFrame(df, samplingRatio=0.1)

           user movie rating
  aa@gmail.com     2      3
  aa@gmail.com     5      5
  bb@gmail.com     8      2
  cc@gmail.com     9      3

我的第一个疑问是,pySpark MLlib不接受我正确的电子邮件?因为我需要通过主键更改电子邮件。

我的方法是创建一个临时表,选择不同的用户,现在我想添加一个带有行号的新列(这个数字将是每个用户的主键。

sparkdf.registerTempTable("sparkdf")

DistinctUsers = sqlContext.sql("Select distinct user FROM sparkdf")

我有什么

+------------+
|        user|
+------------+
|bb@gmail.com|
|aa@gmail.com|
|cc@gmail.com|
+------------+

我想要什么

+------------+
|        user| PK
+------------+
|bb@gmail.com| 1
|aa@gmail.com| 2
|cc@gmail.com| 3
+------------+

接下来,我将进行连接并获取我在MLlib中使用的最终数据框

user movie rating
  1     2      3
  1     5      5
  2     8      2
  3     9      3

此致 谢谢你的时间。

1 个答案:

答案 0 :(得分:2)

here几乎可以回答您的问题,但在这种特殊情况下使用StringIndexer可能是更好的选择:

from pyspark.ml.feature import StringIndexer

indexer = StringIndexer(inputCol="user", outputCol="user_id")
indexed = indexer.fit(sparkdf ).transform(sparkdf)