首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么排序k1,1会改变输出?

为什么排序k1,1会改变输出?
EN

Stack Overflow用户
提问于 2012-09-13 21:54:24
回答 2查看 600关注 0票数 2

我是hadoop世界的新手,我正在努力学习用map reduce的心态来编写代码。

所以,我遵循了michael-noll的教程。

我面临的一个挑战(除了理解一个新的框架)是这个框架使用的终端技巧的数量。

那么到底是什么呢。

代码语言:javascript
复制
  $echo "foo foo quux labs foo bar quux" | /home/hduser/mapper.py | sort -k1,1 | /home/hduser/reducer.py

意思是?echo是做什么的?

另外,上面代码的输出是:

代码语言:javascript
复制
  bar     1
  foo     3
  labs    1
   quux    2

现在如果我没有sort -k1,1之类的东西

代码语言:javascript
复制
  foo     2
  bar     1
  labs    1
  foo     1
   quux    2

排序标志的作用是什么?-k1,1是什么意思?

谢谢..

参考:http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-13 22:12:24

在Linux中,垂直条|用于将一条命令的输出重定向为另一条命令的输入。

echo命令将以下字符串写入标准输出。因此,在本例中,它编写foo foo quux labs foo bar quux,然后将其作为输入传递给/home/hduser/mapper.py,然后将其输出作为输入传递给sort,依此类推。

sort是一个对文本进行排序的Linux命令。-k标志告诉它排序的依据是哪一列。所以1,1告诉它从第一列开始排序,在第一列结束。

在您的Linux终端中键入man sort,以了解有关该命令的更多信息。我希望这能帮到你!

票数 7
EN

Stack Overflow用户

发布于 2012-09-14 01:17:36

如果您打算使用Hadoop Streaming,那么首先运行this tutorial并学习使用shell命令可能会有所帮助。这对你以后会有很大的帮助。

基本上,由于Reducer的工作方式不同,您的输出会有所不同。当当前键与最后一个键相同时,它对所有值求和。当当前键不同于前一个键时,它写出前一个键的值并开始处理当前键。当您的输入看起来像foo foo bar foo时,映射器会按顺序处理这些值,并生成如下输出

代码语言:javascript
复制
foo 1
foo 1
bar 1
foo 1

然后这将以相同的格式发送到您的Reducer。你的Reducer逐行读取它。为了让您更好地理解这一点,以下是Reducer采取的步骤:

代码语言:javascript
复制
// current_key = NULL
input_key,input_value: foo,1
input_key != current_key:
  current_key = input_key
  current_value = input_value
// current_value = 1

// current_key = foo
input_key,input_value: foo,1
input_key == current_key:
  current_value += input_value
// current_value = 2

// current_key = foo
input_key,input_value: bar,1
input_key != current_key:
  emit <current_key, current_value>
  current_key = input_key
  current_value = input_value
// current_value = 1

// current_key = bar
input_key,input_value: foo,1
input_key != current_key:
  emit <current_key, current_value>
  current_key = input_key
  current_value = input_value
// current_value = 1

这将给你提供foo 2,bar 1,foo 1的输出。现在,如果你对Reducer的输入进行排序,它看起来像这样:

代码语言:javascript
复制
foo 1
foo 1
foo 1
bar 1

这使得Reducer可以继续将foo的值相加,而不会被bar键中断,因此您会得到foo 3,bar 1的输出。对值进行排序可以由sort -k1,1完成,这是一个UNIX命令,它根据第一个字段进行排序。Hadoop MapReduce框架对中间值进行排序(即,foo 1,foo 1,bar 1,foo 1数据),以便具有相同键的所有键、值对在相同的Reducer上结束,产生相同的输出,就像您通过sort -k1,1传递中间值一样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12407893

复制
相关文章

相似问题

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