带小数点的map和flatMap的行为

问题描述 投票:0回答:2

考虑这个电影评级数据集(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的行为吗:

  1. flatMap的逻辑是什么?创造这样的结果是什么“扁平化”?
  2. 它为什么剥离“。”单独保留只有整体部分?我们不是要求与“。”分开。
  3. 我应该如何以0.5的分数取回小数结果?
python apache-spark pyspark mapreduce flatmap
2个回答
2
投票

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]])

0
投票

flatMap的逻辑是什么?创造这样的结果是什么“扁平化”?

答案 - line.split(',')[2]返回一个字符串。 flatmap展平字符串(当你展平字符串时,你会得到字符,因为字符串是字符的组合),即,从字符串中创建字符,这就是你在输出中看到一个字符的原因。

它为什么剥离“。”单独保留只有整体部分?我们并没有要求用“。”分开。答案 - 上面的答案解释了为什么不用“。”

我应该如何以0.5的分数取回小数结果?答案 - 再次,上面的答案应该解释你需要做什么。对于处理数字,您可以进一步从字符串映射到数字,然后计算。

如果解决了,请接受答案。

© www.soinside.com 2019 - 2024. All rights reserved.