Python 带小数点的map和flatMap的行为
考虑这个电影分级数据集(userId、movieId、分级、时间戳) 对于评级直方图,我理解我们可以做如下操作Python 带小数点的map和flatMap的行为,python,apache-spark,pyspark,mapreduce,flatmap,Python,Apache Spark,Pyspark,Mapreduce,Flatmap,考虑这个电影分级数据集(userId、movieId、分级、时间戳) 对于评级直方图,我理解我们可以做如下操作 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
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的逻辑是什么?什么是“扁平化”来创造这样的结果 Answer-line.split(',')[2]返回一个字符串。Flatmap展平字符串(当您展平字符串时,您将获得字符,因为字符串是字符的组合),即从字符串中创建字符,这就是为什么您在输出中看到一个字符 为什么它会将“.”分开,只保留完整的部分?我们并不是要求以“.”分开 答案-上面的答案解释了为什么“脱衣舞” 我应该如何使用.5返回十进制结果 分数 答案-同样,上面的答案应该解释您需要做什么。对于处理数字,您可以进一步从字符串映射到数字,然后进行计算
如果答案解决了,请接受。flatMap的逻辑是什么?它是如何“展平”来创建这样的结果的 Answer-line.split(“,”)[2]返回字符串。Flatmap会展平字符串(展平字符串时,会得到字符集,因为字符串是字符的组合),即从字符串中创建字符集,这就是为什么在输出中会看到一个字符集 为什么要把“分开”去掉,只保留不可分割的部分?我们不要求用“分开” 答案-上面的答案解释了为什么“脱衣舞” 我应该如何使用.5返回十进制结果 分数 回答-同样,上面的回答应该解释你需要做什么。对于处理数字,您可以进一步从字符串映射到数字,然后进行计算 如果问题解决了,请接受答案
flatMap的逻辑是什么?什么是“扁平化”来创造这样的结果 获取一个返回“集合”(例如列表)的函数。它本质上相当于执行一个
映射
,将进一步展平的集合返回到单个元素中。在您的flatMap
示例中,函数lambda line:line.split(',')[2]
将每一行转换为第三个拆分字符串,该字符串(被视为一组字符)随后被展平为单个字符
为什么它会将“.”分开,只保留完整的部分?我们并不是要求以“.”分开
由于flatMap
的结果现在是每行第三个拆分字符串的单个字符列表,countByValue()
将对每个数字和小数点(作为字符)进行计数,因此报告结果
我应该如何得到0.5分的小数结果
如果要使用flatMap
生成与map
版本相同的结果:
m.map(lambda line : line.split(',')[2])
您需要使lambda函数返回所选拆分字符串的正确集合,如:
m.flatMap(lambda line : [line.split(',')[2]])
flatMap的逻辑是什么?什么是“扁平化”来创造这样的结果
获取一个返回“集合”(例如列表)的函数。它本质上相当于执行一个映射
,将进一步展平的集合返回到单个元素中。在您的flatMap
示例中,函数lambda line:line.split(',')[2]
将每一行转换为第三个拆分字符串,该字符串(被视为一组字符)随后被展平为单个字符
为什么它会将“.”分开,只保留完整的部分?我们并不是要求以“.”分开
由于flatMap
的结果现在是每行第三个拆分字符串的单个字符列表,countByValue()
将对每个数字和小数点(作为字符)进行计数,因此报告结果
我应该如何得到0.5分的小数结果
如果要使用flatMap
生成与map
版本相同的结果:
m.map(lambda line : line.split(',')[2])
您需要使lambda函数返回所选拆分字符串的正确集合,如:
m.flatMap(lambda line : [line.split(',')[2]])
谢谢@Leo。我会在回家后再试,但我会在这里提出以下问题:1。我们是否可以说,如果我强制它是数字m.flatMap(lambda行:float(line.split(',')[2]),我们就不再有字符列表了?2.如果我使用第一列userId,map和flatMap将产生相同的结果,因为它是数字?@Kenny,1m.flatMap(lambda行:float(line.split(',')[2]))
将崩溃,因为float不能被视为集合,但是flatMap
需要一个返回一个的函数。同样,您可以通过将lambda函数更改为返回,例如,[float(line.split(',')[2])]
使flatMap
工作。2.是的,这取决于你的目标任何分割项目<只要给定的lambda函数具有正确的签名,code>flatMap
就可以工作。谢谢@Leo。我会在回家后再试,但我会在这里提出以下问题:1。我们是否可以说,如果我强制它是数字m.flatMap(lambda行:float(line.split(',')[2]),我们就不再有字符列表了?2.如果我使用第一列userId、map和f