• 关于

    单词完整性

    的搜索结果

回答

该方法sparkContext.wholeTextFiles(...)为你提供了(file, contents)一对,因此当你通过键减少它时,您会得到(file, 1)因为这是每个对键具有的整个文件内容的数量。为了计算每个文件的单词,您需要将每个文件的内容分成这些单词,以便计算它们。我们在这里做,让我们开始阅读文件目录:val files: RDD[(String, String)] = spark.sparkContext.wholeTextFiles("file:///C:/Datasets/DataFiles/")这为每个文件提供了一行,以及完整的文件内容。现在让我们将文件内容分解为单个项目。鉴于你的文件似乎每行有一个单词,使用换行符非常简单:val wordsPerFile: RDD[(String, Array[String])] = files.mapValues(_.split("n"))现在我们只需要计算每个项目中存在的项目数量Array[String]:val wordCountPerFile: RDD[(String, Int)] = wordsPerFile.mapValues(_.size)这基本上就是这样。值得一提的是,虽然计数这个词根本没有被分发(它只是使用了Array[String]),因为你正在一次性加载文件的全部内容。
社区小助手 2019-12-02 01:46:25 0 浏览量 回答数 0

回答

因为需要实际动手操作,你至少有一个Hadoop集群能正常运行,如果你没有Hadoop集群的话,下面的教程可以帮你建立一个。下面的教程是基于Ubuntu系统建立的,但是你可以将他们应用到其它Linux、Unix系统上。 Running Hadoop On Ubuntu Linux (Multi-Node Cluster) Running Hadoop On Ubuntu Linux (Single-Node Cluster) Python MapReduce 源码解析 以下Python代码所使用的技巧是基于Hadoop 数据流的接口实现的。借助该接口,我们可以通过标准输入(stdin)和标准输出(stdout)来传递Map和Reduce过程之间的数据。这里我们简单地使用Python的sys.stdin读取数据并通过sys.stdout输出数据,剩下的事情就全交给Hadoop啦~ Map 将以下代码写入 /home/hduser/mapper.py 它会从stdin读取数据,分割其中的单词然后按行输出单词和其词频到stdout 。不过整个Map处理过程并不会统计每个单词出现总的次数,而是直接输出( , 1)元组。尽管某些单词会出现不止一次,但只要单词出现一次我们就输出一个( , 1)元组。在接下来的Reduce过程我们会统计单词出现的总的次数。当然,你也可以不这么做,但是出于“教程”这一目的,接下来的内容会按照这一思路来写。 :-) 注意:确保该文件是可执行的(chmod +x /home/hduser/mapper.py),否则会出问题。另外第一行记得添加 #!/usr/bin/env python mapper.py 01 #!/usr/bin/env python 02 03 import sys 04 05 # input comes from STDIN (standard input) 06 for line in sys . stdin : 07 # remove leading and trailing whitespace 08 line = line . strip() 09 # split the line into words 10 words = line . split() 11 # increase counters 12 for word in words : 13 # write the results to STDOUT (standard output); 14 # what we output here will be the input for the 15 # Reduce step, i.e. the input for reducer.py 16 # 17 # tab-delimited; the trivial word count is 1 18 print ' %s \t %s ' % ( word , 1) Reduce 将以下代码保存到/home/hduser/reducer.py 它会从stdin读取mapper.py的结果(因此mapper.py的输出格式应该与reducer.py的输入格式一致),然后统计每个单词出现的总的次数并输出到stdout 注意:确保该文件是可执行的(chmod +x /home/hduser/mapper.py),否则会出问题。另外第一行记得添加 #!/usr/bin/env python reducer.py 01 #!/usr/bin/env python 02 03 from operator import itemgetter 04 import sys 05 06 current_word = None 07 current_count = 0 08 word = None 09 10 # input comes from STDIN 11 for line in sys . stdin : 12 # remove leading and trailing whitespace 13 line = line . strip() 14 15 # parse the input we got from mapper.py 16 word , count = line . split( ' \t ' , 1) 17 18 # convert count (currently a string) to int 19 try : 20 count = int( count) 21 except ValueError : 22 # count was not a number, so silently 23 # ignore/discard this line 24 continue 25 26 # this IF-switch only works because Hadoop sorts map output 27 # by key (here: word) before it is passed to the reducer 28 if current_word == word : 29 current_count += count 30 else : 31 if current_word : 32 # write result to STDOUT 33 print ' %s \t %s ' % ( current_word , current_count) 34 current_count = count 35 current_word = word 36 37 # do not forget to output the last word if needed! 38 if current_word == word : 39 print ' %s \t %s ' % ( current_word , current_count) 测试你的代码(cat data | map | sort | reduce) 建议在Hadoop上实际运行mapreduce之前先在本地测试mapper.py和reducer.py否侧可能会出现程序能正常执行但却完全没有输出结果或者输出不是你想要的结果。如果这发生的话,多半是你自己搞砸了...... test 01 # very basic test 02 hduser@ubuntu:~ $ echo "foo foo quux labs foo bar quux" | /home/hduser/mapper.py 03 foo 1 04 foo 1 05 quux 1 06 labs 1 07 foo 1 08 bar 1 09 quux 1 10 11 hduser@ubuntu:~ $ echo "foo foo quux labs foo bar quux" | /home/hduser/mapper.py | sort -k1,1 | /home/hduser/reducer.py 12 bar 1 13 foo 3 14 labs 1 15 quux 2 16 17 # using one of the ebooks as example input 18 # (see below on where to get the ebooks) 19 hduser@ubuntu:~ $ cat /tmp/gutenberg/20417-8.txt | /home/hduser/mapper.py 20 The 1 21 Project 1 22 Gutenberg 1 23 EBook 1 24 of 1 25 [... ] 26 (you get the idea) 在Hadoop上运行 Python代码 下载测试用的输入数据 我们使用古腾堡项目中的三本电子书作为测试: The Outline of Science, Vol. 1 (of 4) by J. Arthur Thomson The Notebooks of Leonardo Da Vinci Ulysses by James Joyce 下载这些电子书的 txt格式,然后将这些文件保存到一个临时文件夹比如 /tmp/gutenberg 1 hduser@ubuntu:~ $ ls -l /tmp/gutenberg/ 2 total 3604 3 -rw-r--r-- 1 hduser hadoop 674566 Feb 3 10:17 pg20417.txt 4 -rw-r--r-- 1 hduser hadoop 1573112 Feb 3 10:18 pg4300.txt 5 -rw-r--r-- 1 hduser hadoop 1423801 Feb 3 10:18 pg5000.txt 6 hduser@ubuntu:~ $ 将本地的数据拷贝到HDFS上 在运行MapReduce任务之前,我们必须先将本地文件拷贝到Hadoop的文件系统上 01 hduser@ubuntu:/usr/local/hadoop $ bin/hadoop dfs -copyFromLocal /tmp/gutenberg /user/hduser/gutenberg 02 hduser@ubuntu:/usr/local/hadoop $ bin/hadoop dfs -ls 03 Found 1 items 04 drwxr-xr-x - hduser supergroup 0 2010-05-08 17:40 /user/hduser/gutenberg 05 hduser@ubuntu:/usr/local/hadoop $ bin/hadoop dfs -ls /user/hduser/gutenberg 06 Found 3 items 07 -rw-r--r-- 3 hduser supergroup 674566 2011-03-10 11:38 /user/hduser/gutenberg/pg20417.txt 08 -rw-r--r-- 3 hduser supergroup 1573112 2011-03-10 11:38 /user/hduser/gutenberg/pg4300.txt 09 -rw-r--r-- 3 hduser supergroup 1423801 2011-03-10 11:38 /user/hduser/gutenberg/pg5000.txt 10 hduser@ubuntu:/usr/local/hadoop $ 运行MapReduce任务 现在一切都准备好了,我们可以通过Hadoop的数据流API来传送Map和Reduce过程中间的数据。 1 hduser@ubuntu:/usr/local/hadoop $ bin/hadoop jar contrib/streaming/hadoop-streaming.jar 2 -file /home/hduser/mapper.py -mapper /home/hduser/mapper.py 3 -file /home/hduser/reducer.py -reducer /home/hduser/reducer.py 4 -input /user/hduser/gutenberg/* -output /user/hduser/gutenberg-output 你可以通过指定 -D参数来更改一些Hadoop 设置,比如增加reducer数量 1 hduser@ubuntu:/usr/local/hadoop $ bin/hadoop jar contrib/streaming/hadoop-streaming.jar -D mapred.reduce.tasks =16 ... 注意在命令行中可以接受mapred.reducetasks参数来指定reduce的个数,但是不能仅仅通过指定mapred.reduce.tasks来指定map tasks的个数。 整个任务会从HDFS的路径/user/huser/gutenberg 上读取所有的文件,然后处理并输出到HDFS的路径/user/huser/gutnberg-output事实上Hadoop会给每个reducer创建一个输出文件,在我们的例子中只会输出一个文件因为输入的文件很小。上面命令行的输出示例如下: 01 hduser@ubuntu:/usr/local/hadoop $ bin/hadoop jar contrib/streaming/hadoop-streaming.jar -mapper /home/hduser/mapper.py -reducer /home/hduser/reducer.py -input /user/hduser/gutenberg/* -output /user/hduser/gutenberg-output 02 additionalConfSpec_:null 03 null =@@@userJobConfProps_.get(stream.shipped.hadoopstreaming 04 packageJobJar: [/app/hadoop/tmp/hadoop-unjar54543/ ] 05 [] /tmp/streamjob54544.jar tmpDir =null 06 [... ] INFO mapred.FileInputFormat: Total input paths to process : 7 07 [... ] INFO streaming.StreamJob: getLocalDirs(): [/app/hadoop/tmp/mapred/local ] 08 [... ] INFO streaming.StreamJob: Running job: job_200803031615_0021 09 [... ] 10 [... ] INFO streaming.StreamJob: map 0% reduce 0% 11 [... ] INFO streaming.StreamJob: map 43% reduce 0% 12 [... ] INFO streaming.StreamJob: map 86% reduce 0% 13 [... ] INFO streaming.StreamJob: map 100% reduce 0% 14 [... ] INFO streaming.StreamJob: map 100% reduce 33% 15 [... ] INFO streaming.StreamJob: map 100% reduce 70% 16 [... ] INFO streaming.StreamJob: map 100% reduce 77% 17 [... ] INFO streaming.StreamJob: map 100% reduce 100% 18 [... ] INFO streaming.StreamJob: Job complete: job_200803031615_0021 19 [... ] INFO streaming.StreamJob: Output: /user/hduser/gutenberg-output 20 hduser@ubuntu:/usr/local/hadoop $ 从上面的输出可以看到,Hadoop还为一些统计信息提供了一个基本的网页接口。在Hadoop集群运行时可以打开 http://localhost:50030 查看HDFS路径/user/hduser/gutenberg-output上的文件 你可以通过 dfs -cat命令查看输出文件的内容 01 hduser@ubuntu:/usr/local/hadoop $ bin/hadoop dfs -cat /user/hduser/gutenberg-output/part-00000 02 "(Lo)cra" 1 03 "1490 1 04 "1498, " 1 05 "35 " 1 06 "40, " 1 07 "A 2 08 "AS-IS". 2 09 "A_ 1 10 "Absoluti 1 11 [... ] 12 hduser@ubuntu:/usr/local/hadoop $ 注意上面截图中单词两边的双引号并不是Hadoop自己加上去的,而是python程序将单词分割后生成的,不信的话可以查看完整的输出文件。 使用python的迭代器和生成器改进mapper和reducer代码 上面的例子应该让你明白了怎样构建一个MapReduce应用,不过上面那些代码侧重于易读性,特别是针对Python程序员新手。然而,在真实的应用中,你可能需要使用Python的迭代器和生成器来优化你的代码。 一般来说,迭代器和生成器(产生迭代的函数,比如包含yield输出语句)的优点是只有在你需要使用一个序列的元素时它才会生成该元素。这对于计算量很大或者内存开销很大的任务来说是很有用的。 注意,下面的Map和Reduce脚本只有在Hadoop的环境下才能正常运行,也就是说使用本地的命令“cat Data | ./mapper.py |sort -k1,1 |./reucer.py”并不会正常运行,因为有些函数特性在不能离开Hadoop mapper.py 01 #!/usr/bin/env python 02 """A more advanced Mapper, using Python iterators and generators.""" 03 04 import sys 05 06 def read_input( file ): 07 for line in file : 08 # split the line into words 09 yield line . split() 10 11 def main( separator = ' \t ' ): 12 # input comes from STDIN (standard input) 13 data = read_input( sys . stdin) 14 for words in data : 15 # write the results to STDOUT (standard output); 16 # what we output here will be the input for the 17 # Reduce step, i.e. the input for reducer.py 18 # 19 # tab-delimited; the trivial word count is 1 20 for word in words : 21 print ' %s%s%d ' % ( word , separator , 1) 22 23 if name == "main" : 24 main() reducer.py 01 #!/usr/bin/env python 02 """A more advanced Reducer, using Python iterators and generators.""" 03 04 from itertools import groupby 05 from operator import itemgetter 06 import sys 07 08 def read_mapper_output( file , separator = ' \t ' ): 09 for line in file : 10 yield line . rstrip() . split( separator , 1) 11 12 def main( separator = ' \t ' ): 13 # input comes from STDIN (standard input) 14 data = read_mapper_output( sys . stdin , separator = separator) 15 # groupby groups multiple word-count pairs by word, 16 # and creates an iterator that returns consecutive keys and their group: 17 # current_word - string containing a word (the key) 18 # group - iterator yielding all ["<current_word>", "<count>"] items 19 for current_word , group in groupby( data , itemgetter( 0 )): 20 try : 21 total_count = sum( int( count) for current_word , count in group) 22 print " %s%s%d " % ( current_word , separator , total_count) 23 except ValueError : 24 # count was not a number, so silently discard this item 25 pass 26 27 if name == "main" : 28 main()
游客2q7uranxketok 2021-02-22 13:27:10 0 浏览量 回答数 0

问题

【精品问答】Java基础测试题(附答案)

Java作为市场最大的语言,一直受开发者关注,很多开发者也是将其应用于各个领域。那么,对于Java基础知识你还掌握多少呢?下面来检测下吧! Java源程序文件的后缀是&...
游客pklijor6gytpx 2019-12-01 22:00:58 577 浏览量 回答数 1

回答

一旦我回顾了对我而言至关重要的Haskell数组库的功能,并编译了一个比较表(仅电子表格:直接链接)。所以我会尽力回答。 我应该在什么基础上选择Vector.Unboxed和UArray?它们都是未装箱的数组,但Vector抽象似乎广为宣传,尤其是在循环融合方面。Vector总是更好吗?如果没有,我什么时候应该使用哪种表示形式? 如果需要二维或多维数组,则最好使用UArray而不是Vector。但是Vector有更好的API来处理向量。通常,Vector不太适合模拟多维数组。 Vector.Unboxed不能与并行策略一起使用。我怀疑不能同时使用UArray,但是至少很容易从UArray切换到盒装Array,看看并行化是否带来的好处超过了装箱成本。 对于彩色图像,我希望存储三位16位整数或三位单精度浮点数。为此,Vector或UArray是否更易于使用?表现更好? 我尝试使用数组表示图像(尽管我只需要灰度图像)。对于彩色图像,我使用Codec-Image-DevIL库读取/写入图像(绑定到DevIL库),对于灰度图像,我使用pgm库(纯Haskell)。 我对Array的主要问题是,它仅提供随机访问存储,但是它不提供许多构建Array算法的方法,也没有随便使用数组例程库(不与线性代数库接口,不允许表达卷积,fft和其他变换)。 几乎每次必须从现有阵列中构建一个新数组时,都必须构造一个中间值列表(就像Gentle Introduction 中的矩阵乘法一样)。数组构建的成本通常超过了更快的随机访问带来的好处,以至于在我的一些用例中,基于列表的表示更快。 STUArray可以为我提供帮助,但我不喜欢与神秘的类型错误以及使用STUArray编写多态代码所需的工作抗争。 因此,数组的问题在于它们不适用于数值计算。在这方面,Hmatrix的Data.Packed.Vector和Data.Packed.Matrix更好,因为它们带有固态矩阵库(注意:GPL许可证)。在性能方面,就矩阵乘法而言,hmatrix足够快(仅比Octave慢一些),但非常耗内存(比Python / SciPy消耗多倍)。 也有用于矩阵的blas库,但它不是基于GHC7建立的。 我对Repa并没有太多的经验,并且我不太了解repa代码。从我的角度来看,它可以使用的矩阵和数组算法的使用范围非常有限,但是至少可以通过该库来表达重要的算法。例如,已经存在用于矩阵乘法和用于 REPA算法中的卷积的例程。不幸的是,似乎卷积现在仅限于7×7内核(对我来说这还不够,但足以满足许多用途)。 我没有尝试过Haskell OpenCV绑定。它们应该很快,因为OpenCV确实非常快,但是我不确定绑定是否完整并且足够好以致于无法使用。而且,OpenCV本质上是非常必要的,充满破坏性的更新。我想很难在其上设计一个美观而有效的功能接口。如果采用OpenCV方式,他很可能会在任何地方使用OpenCV图像表示形式,并使用OpenCV例程对其进行操作。 对于双色调图像,每个像素仅需要存储1位。是否有预定义的数据类型可以通过将多个像素打包成一个单词来为我提供帮助,还是我自己? 据我所知,Unboxed的Bools数组负责打包和解包位向量。我记得在其他库中看过布尔数组的实​​现,在其他地方都没有看到。 最后,我的数组是二维的。我想我可以处理表示形式为“数组数组”(或向量的向量)带来的额外间接,但我更喜欢具有索引映射支持的抽象。谁能推荐标准库或Hackage中的任何内容? 除了Vector(和简单列表)之外,所有其他数组库都能够表示二维数组或矩阵。我想他们避免不必要的间接。
保持可爱mmm 2020-02-07 23:04:16 0 浏览量 回答数 0

问题

Java基础测试题|挑战你的底线

1、填空题 1、Java源程序文件的后缀是_____,Java字节码文件的后缀名称是_____。 2、Java程序实现可移值性,依靠的是_____。 3、Java语言的三个分支是:_____。...
游客pklijor6gytpx 2019-12-01 22:01:00 2559 浏览量 回答数 3

问题

第6篇 指针数组字符串(下)补充:报错

我们回到control.c文件里。那么我们就可以利用g_pcontrol_input进行读取工作。当然这里有个学院派的做法,就是检测当前文件的长度,毕竟如果这个长度比BUF大,我们得认为不能处理嘛。...
kun坤 2020-06-08 11:02:03 3 浏览量 回答数 1

问题

【精品问答】Java基础测试题答案

1、Java源程序文件的后缀是*.java,Java字节码文件的后缀名称是*.class。 2、Java程序实现可移值性,依靠的是JVM。 3、Java语言的三个分支是:JAVASE、JAVAM...
游客pklijor6gytpx 2019-12-01 22:02:11 2957 浏览量 回答数 3

问题

【精品问答】Java必备核心知识1000+(附源码)

为了方便Java开发者快速找到相关技术问题和答案,开发者社区策划了Java技术1000问内容,包含最基础的如何学Java、实践中遇到的技术问题、RocketMQ面试、Java容器部署实践等维度内容。 我们会以每...
问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT