Skip to main content
 首页 » 编程设计

python之PySpark 中的聚合

2024年10月25日58落叶无声

我的数据格式是

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 & scores 并返回一个 RDD,其中每个元素都是项目 &得分值。从那里我们可以只提取分数并将其转换为 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()