我的数据格式是
UserId\tItemId:Score,ItemId:Score
UserId\tItemId:Score,ItemId:Score,ItemId:Score
等等..
我试图通过减去平均值并除以标准差来标准化分数。 我的数据存在于 S3 上,大约有 300 个文件或每个文件 30Mb。 我正在使用 PySpark。 这是我的尝试:
lines = sc.textFile("s3n://data-files/clustering")
Itr1 = lines.map(lambda x:str(x))
Itr1.take(3)
['1\t1:0.1,2:0.2', '2\t3:0.4,4:0.6', '3\t5:0.8,6:0.1']
Itr2 = Itr1.map(lambda x: x.split("\t"))
Itr2.take(3)
[['1', '1:0.1,2:0.2'], ['2', '3:0.4,4:0.6'], ['3', '5:0.8,6:0.1']]
ItemRecScore = Itr2.map(lambda x:[x[1]])
ItemRecScore.take(3)
[['1:0.1,2:0.2'], ['3:0.4,4:0.6'], ['5:0.8,6:0.1']]
ItemRecScoreClean = ItemRecScore.map(lambda x: x[0].replace(':',' '))
ItemRecScore.take(3)
['1 0.1,2 0.2', '3 0.4,4 0.6', '5 0.8,6 0.1']
1)我如何提取分数以便我可以调用,
mean()
和 stdev()
来计算参数。
2) 如何转换乐谱?
我是 PySpark 的新手,如果这是一项明显简单的任务,我深表歉意。 任何展示如何在 PySpark 中操作和聚合数据的指示或教程都会有所帮助。
最佳答案
由于每行输入都有多个分数,我们可以使用 flatMap
从每行中提取所有 itemids 和分数,并返回一个 RDD,其中每个元素都是 item & 之一分值。从那里我们可以提取分数并将其转换为 float ,以便 PySpark 的数值方法可以对其进行处理。完成此操作后,我们只需在 RDD 上调用 stats() 即可获取您感兴趣的信息。
inputData = sc.textFile(inputFile)
idScores = inputData.flatMap(lambda x: x.split("\t")[1].split(","))
scores = idScores.map(lambda x: float(x.split(":")[1]))
print scores.stats()
关于python - PySpark 中的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24275542/