PySpark中的聚合

2 投票
2 回答
1789 浏览
提问于 2025-04-18 10:09

我的数据格式是

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中处理和聚合数据,那就太好了。

2 个回答

0

可能是这个 ...

import numpy as np
itr1 = sc.textFile('hdfs:///user/rkarra777/data/mean.txt')
itr2 = itr1.map(lambda x : x.split('\\t')[1]).map(lambda x : x.split(','))
itr3 = itr2.map(lambda x : [float(str((k.split(':')[1]))) for k in x ])
itr4 = itr3.map(lambda x : np.mean([item for item in x]))
2

因为你每一行输入都有多个分数,我们可以用 flatMap 来提取每一行中的所有项目ID和分数,这样就能得到一个RDD,其中每个元素都是一个项目和分数的值。接下来,我们可以只提取分数,并把它转换成浮点数,这样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()

撰写回答