考虑这个电影评级数据集(userId,movieId,rating,timestamp)
1,1,4.0,964982703
1,3,4.0,964981247
1,223,3.0,964980985
1,231,5.0,964981179
1,1226,5.0,964983618
6,95,4.0,845553559
6,100,3.0,845555151
6,102,1.0,845555436
6,104,4.0,845554349
6,105,3.0,845553757
6,110,5.0,845553283
6,112,4.0,845553994
610,152081,4.0,1493846503
610,152372,3.5,1493848841
610,155064,3.5,1493848456
610,156371,5.0,1479542831
610,156726,4.5,1493848444
610,157296,4.0,1493846563
610,158238,5.0,1479545219
610,158721,3.5,1479542491
610,160080,3.0,1493848031
610,160341,2.5,1479545749
610,160527,4.5,1479544998
m = sc.textFile('movies/ratings_s.csv')
对于评级直方图,我了解我们可以做如下
scores = m.map(lambda line : line.split(',')[2])
sorted(scores.countByValue().items())
[('1.0', 1), ('2.5', 1), ('3.0', 4), ('3.5', 3), ('4.0', 7), ('4.5', 2), ('5.0', 5)]
我试过flatMap只是为了理解差异:
scores = m.flatMap(lambda line : line.split(',')[2])
sorted(scores.countByValue().items())
我的结果是
[('.', 23), ('0', 17), ('1', 1), ('2', 1), ('3', 7), ('4', 9), ('5', 11)]
你能帮忙解释一下flatMap的行为吗:
flatMap的逻辑是什么?创造这样的结果是什么“扁平化”?
flatMap采用一个返回“集合”(例如列表)的函数。它基本上相当于执行map
将更多flattened
的集合返回到其各自的元素中。在你的flatMap
例子中,函数lambda line : line.split(',')[2]
将每一行转换为第三个分裂字符串,然后(被视为字符集合)将flattened
转换为单个字符。
它为什么剥离“。”单独保留只有整体部分?我们不是要求与“。”分开。
由于flatMap
的结果现在是每行第3个分裂字符串的单个字符列表,countByValue()
将计算每个数字和小数点(作为字符),因此报告结果。
我应该如何以0.5的分数取回小数结果?
如果你想使用flatMap
产生与map
版本相同的结果:
m.map(lambda line : line.split(',')[2])
您需要使lambda函数返回所选拆分字符串的正确集合,例如:
m.flatMap(lambda line : [line.split(',')[2]])
flatMap的逻辑是什么?创造这样的结果是什么“扁平化”?
答案 - line.split(',')[2]返回一个字符串。 flatmap展平字符串(当你展平字符串时,你会得到字符,因为字符串是字符的组合),即,从字符串中创建字符,这就是你在输出中看到一个字符的原因。
它为什么剥离“。”单独保留只有整体部分?我们并没有要求用“。”分开。答案 - 上面的答案解释了为什么不用“。”
我应该如何以0.5的分数取回小数结果?答案 - 再次,上面的答案应该解释你需要做什么。对于处理数字,您可以进一步从字符串映射到数字,然后计算。
如果解决了,请接受答案。