带小数点的map和flatMap的行为

时间:2019-03-11 01:15:25

标签: python apache-spark pyspark mapreduce flatmap

请考虑以下电影评分数据集(用户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的行为吗?

  1. flatMap的逻辑是什么?产生这样的结果会“变平”什么?

  2. 为什么要剥离“。”分开并仅保留不可分割的部分?我们不要求用“。”分隔。

  3. 如何获取.5分数的小数结果?

2 个答案:

答案 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的十进制结果 得分了 ? 答案-同样,以上答案应解释您需要做什么。要处理数字,您可以从字符串到数字进一步映射,然后计算。

如果可以解决,请接受答案。