请考虑以下电影评分数据集(用户ID,电影ID,评分,时间戳记)
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的逻辑是什么?产生这样的结果会“变平”什么?
为什么要剥离“。”分开并仅保留不可分割的部分?我们不要求用“。”分隔。
如何获取.5分数的小数结果?
答案 0 :(得分:2)
flatMap的逻辑是什么?产生这种结果是什么“变平”?
flatMap采用返回“集合”(例如列表)的函数。从本质上讲,这等效于执行map
以将进一步flattened
的集合返回到其各个元素中。在您的flatMap
示例中,函数lambda line : line.split(',')[2]
将每一行转换为第3个分割字符串,然后将其flattened
转换为各个字符(被视为字符集合)。
为什么要删除“。”分开并仅保留不可分割的部分?我们不要求用“。”分隔。
由于flatMap
的结果现在是每行第3个分割字符串的各个字符的列表,因此countByValue()
将计算每个数字和小数点(作为字符),因此是报告的结果。
我应该如何获得.5分数的小数结果?
如果您想使用flatMap
来产生与map
版本相同的结果:
m.map(lambda line : line.split(',')[2])
您需要使lambda函数返回所选拆分字符串的正确集合,例如:
m.flatMap(lambda line : [line.split(',')[2]])
答案 1 :(得分:0)
flatMap的逻辑是什么?产生这种结果是什么“变平”?
答案-line.split(',')[2]返回一个字符串。 Flatmap展平字符串(展平字符串时,由于字符串是字符的组合,因此会得到字符),即从字符串中创建字符,这就是为什么在输出中看到一个字符的原因。
为什么要删除“。”分开并仅保留不可分割的部分?我们不要求用“。”分割。 答案-上面的答案解释了为什么剥“。”的原因。
如何获取.5的十进制结果 得分了 ? 答案-同样,以上答案应解释您需要做什么。要处理数字,您可以从字符串到数字进一步映射,然后计算。
如果可以解决,请接受答案。