由于某些原因,rmr2似乎在某些情况下不正确地处理密钥,重复每个值的键。
我在Windows 7下使用RVersion3.1.1,64位版本,我的rmr版本是rmr2_2.3.0.
我通过设置rmr.options(backend=" local ")来使用本地模式。
我有一个非常简单的文本文件,其中包含以下内容:
a|1|blue
b|2|green
c|1|green
d|3|blue
e|2|yellow我可以轻松地使用以下map-还原作业检索这些内容,其中f是我文件的路径:
library(rmr2)
from.dfs(
mapreduce(
input=f,
input.format="text",
map = function(k,v) keyval(k,v)))如预期的那样,产出如下:
$key
NULL
$val
[1] "a|1|blue" "b|2|green" "c|1|green" "d|3|blue" "e|2|yellow"我可以运行另一个映射减少作业,它将指定行的长度作为传递给还原器的键:
from.dfs(
mapreduce(
input=f,
input.format="text",
map = function(k,v) keyval(str_length(v),v)))正如预期的那样,产出是:
$key
[1] 8 8 9 9 10
$val
[1] "a|1|blue" "d|3|blue" "b|2|green" "c|1|green" "e|2|yellow"我可以用第一个字符代替值的长度:
from.dfs(
mapreduce(
input=f,
input.format="text",
map = function(k,v) keyval(substr(v,0,1),v)))同样,预期的产出是:
$key
[1] "a" "b" "c" "d" "e"
$val
[1] "a|1|blue" "b|2|green" "c|1|green" "d|3|blue" "e|2|yellow"到现在为止还好。现在,我想拆分值并使用第一个字段。我的代码是:
from.dfs(
mapreduce(
input=f,
input.format="text",
map = function(k,v) keyval(unlist(strsplit(v,'\\|'))[1],v)))这一次,非常出乎意料的输出是:
$key
[1] "a" "a" "a" "a" "a"
$val
[1] "a|1|blue" "b|2|green" "c|1|green" "d|3|blue" "e|2|yellow"我希望看到与前面使用子字符串的示例相同的输出,但不是键向量"a“b”c“"d”"e“,而是第一个重复了5次"a”"a“"a”的输出。
我可以将我想要得到的字段更改为第三个字段:
from.dfs(
mapreduce(
input=f,
input.format="text",
map = function(k,v) keyval(unlist(strsplit(v,'\\|'))[3],v)))第一个键是重复的,而不是每个值的唯一键。产出如下:
$key
[1] "blue" "blue" "blue" "blue" "blue"
$val
[1] "a|1|blue" "b|2|green" "c|1|green" "d|3|blue" "e|2|yellow"这件事让我束手无策。这是怎么回事?这是rmr2中的一个bug,还是什么?
更新:我在一个运行rmr2_3.1.1的Ubuntu12.04系统上尝试了相同的例子,该系统使用了一个完全分布式的HDP2集群,并得到了几乎相同的结果。对于返回预期结果的示例,我得到的唯一区别是键的顺序,val对与文件中的顺序不一样(这是可以理解的)。对于有问题的例子,我得到了更奇怪的结果:
$key
[1] "d" "d" "a" "a" "a"
$val
[1] "d|3|blue" "e|2|yellow" "a|1|blue" "b|2|green" "c|1|green"发布于 2014-07-21 17:48:36
回答我自己的问题。这个问题的答案包括理解(猜测)映射函数输入的(k,v)参数的结构。它们似乎是价值的载体。也就是说,使用包含拆分的所有值的向量调用map函数一次。这是可能的,因为Hadoop流正在被使用。与典型的Java映射函数形成对比,该函数对每个值调用一次,每次调用时只接收一个值。
因此,解决方案是使用:
from.dfs(
mapreduce(
input=f,
input.format="text",
map = function(k,v) keyval(matrix(unlist(strsplit(v,'\\|')),nrow=length(v),byrow=TRUE)[,1],v)))它产生所需的结果:
$key
[1] "d" "e" "a" "b" "c"
$val
[1] "d|3|blue" "e|2|yellow" "a|1|blue" "b|2|green" "c|1|green"https://stackoverflow.com/questions/24857415
复制相似问题