首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rmr2正在复制我的映射器中的密钥

rmr2正在复制我的映射器中的密钥
EN

Stack Overflow用户
提问于 2014-07-21 03:41:54
回答 1查看 483关注 0票数 2

由于某些原因,rmr2似乎在某些情况下不正确地处理密钥,重复每个值的键。

我在Windows 7下使用RVersion3.1.1,64位版本,我的rmr版本是rmr2_2.3.0.

我通过设置rmr.options(backend=" local ")来使用本地模式。

我有一个非常简单的文本文件,其中包含以下内容:

代码语言:javascript
复制
a|1|blue
b|2|green
c|1|green
d|3|blue
e|2|yellow

我可以轻松地使用以下map-还原作业检索这些内容,其中f是我文件的路径:

代码语言:javascript
复制
library(rmr2)

from.dfs(
  mapreduce(
  input=f,
  input.format="text",
  map = function(k,v) keyval(k,v)))

如预期的那样,产出如下:

代码语言:javascript
复制
$key
NULL

$val
[1] "a|1|blue"   "b|2|green"  "c|1|green"  "d|3|blue"   "e|2|yellow"

我可以运行另一个映射减少作业,它将指定行的长度作为传递给还原器的键:

代码语言:javascript
复制
from.dfs(
  mapreduce(
  input=f,
  input.format="text",
   map = function(k,v) keyval(str_length(v),v)))

正如预期的那样,产出是:

代码语言:javascript
复制
$key
[1]  8  8  9  9 10

$val
[1] "a|1|blue"   "d|3|blue"   "b|2|green"  "c|1|green"  "e|2|yellow"

我可以用第一个字符代替值的长度:

代码语言:javascript
复制
from.dfs(
  mapreduce(
  input=f,
  input.format="text",
  map = function(k,v) keyval(substr(v,0,1),v)))

同样,预期的产出是:

代码语言:javascript
复制
$key
[1] "a" "b" "c" "d" "e"

$val
[1] "a|1|blue"   "b|2|green"  "c|1|green"  "d|3|blue"   "e|2|yellow"

到现在为止还好。现在,我想拆分值并使用第一个字段。我的代码是:

代码语言:javascript
复制
from.dfs(
  mapreduce(
  input=f,
  input.format="text",
  map = function(k,v) keyval(unlist(strsplit(v,'\\|'))[1],v)))

这一次,非常出乎意料的输出是:

代码语言:javascript
复制
$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”的输出。

我可以将我想要得到的字段更改为第三个字段:

代码语言:javascript
复制
from.dfs(
  mapreduce(
  input=f,
  input.format="text",
  map = function(k,v) keyval(unlist(strsplit(v,'\\|'))[3],v)))

第一个键是重复的,而不是每个值的唯一键。产出如下:

代码语言:javascript
复制
$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对与文件中的顺序不一样(这是可以理解的)。对于有问题的例子,我得到了更奇怪的结果:

代码语言:javascript
复制
$key
[1] "d" "d" "a" "a" "a"

$val
[1] "d|3|blue"   "e|2|yellow" "a|1|blue"   "b|2|green"  "c|1|green"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-21 17:48:36

回答我自己的问题。这个问题的答案包括理解(猜测)映射函数输入的(k,v)参数的结构。它们似乎是价值的载体。也就是说,使用包含拆分的所有值的向量调用map函数一次。这是可能的,因为Hadoop流正在被使用。与典型的Java映射函数形成对比,该函数对每个值调用一次,每次调用时只接收一个值。

因此,解决方案是使用:

代码语言:javascript
复制
from.dfs( 
  mapreduce(
  input=f,
  input.format="text",
   map = function(k,v) keyval(matrix(unlist(strsplit(v,'\\|')),nrow=length(v),byrow=TRUE)[,1],v)))

它产生所需的结果:

代码语言:javascript
复制
$key
[1] "d" "e" "a" "b" "c"

$val
[1] "d|3|blue"   "e|2|yellow" "a|1|blue"   "b|2|green"  "c|1|green"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24857415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档