我正在 Hadoop 上实现一个 PageRank 算法,正如标题所说,我在尝试执行代码时遇到了以下错误:
映射键中的类型不匹配:预期的 org.apache.hadoop.io.Text,收到的 org.apache.hadoop.io.LongWritable
在我的输入文件中,我将图形节点 ID 存储为键,并将关于它们的一些信息存储为值。我的输入文件具有以下格式:
1\t 3.4,2,5,6,67
4\t 4.2,77,2,7,83
... ...
为了理解错误的含义,我尝试使用 LongWritable 作为我的主要变量类型,如下面的代码所示。这意味着我有:
map < longwritable,longwritable,longwritable,longwritable="">
减少
但是,我也试过: map <文字,文字,文字,文字>
减少<文本,文本,文本,文本>
还有: map < longwritable,text,longwritable,text=""> 减少< longwritable,text,longwritable,text=""> 而且我总是会犯同样的错误。我想我很难理解错误中预期和收到的含义。这是否意味着我的 map 函数需要输入文件中的 LongWritable 并且它得到了文本?我使用的输入文件格式或变量类型有问题吗? 这是完整的代码,你能告诉我要更改的内容和位置吗?:import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.lang.Object.*;
import org.apache.commons.cli.ParseException;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.configuration.Configuration;
import org.apache.hadoop.security.Credentials;
import org.apache.log4j.*;
import org.apache.commons.logging.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class Pagerank
{
public static class PRMap extends Mapper<LongWritable, LongWritable, LongWritable, LongWritable>
{
public void map(LongWritable lineNum, LongWritable line, OutputCollector<LongWritable, LongWritable> outputCollector, Reporter reporter) throws IOException, InterruptedException
{
if (line.toString().length() == 0) {
return;
}
Text key = new Text();
Text value = new Text();
LongWritable valuel = new LongWritable();
StringTokenizer spline = new StringTokenizer(line.toString(),"\t");
key.set(spline.nextToken());
value.set(spline.nextToken());
valuel.set(Long.parseLong(value.toString()));
outputCollector.collect(lineNum,valuel);
String info = value.toString();
String splitter[] = info.split(",");
if(splitter.length >= 3)
{
float f = Float.parseFloat(splitter[0]);
float pagerank = f / (splitter.length - 2);
for(int i=2;i<splitter.length;i++)
{
LongWritable key2 = new LongWritable();
LongWritable value2 = new LongWritable();
long l;
l = Long.parseLong(splitter[i]);
key2.set(l);
//key2.set(splitter[i]);
value2.set((long)f);
outputCollector.collect(key2, value2);
}
}
}
}
public static class PRReduce extends Reducer<LongWritable,LongWritable,LongWritable,LongWritable>
{
private Text result = new Text();
public void reduce(LongWritable key, Iterator<LongWritable> values,OutputCollector<LongWritable, LongWritable> results, Reporter reporter) throws IOException, InterruptedException
{
float pagerank = 0;
String allinone = ",";
while(values.hasNext())
{
LongWritable temp = values.next();
String converted = temp.toString();
String[] splitted = converted.split(",");
if(splitted.length > 1)
{
for(int i=1;i<splitted.length;i++)
{
allinone = allinone.concat(splitted[i]);
if(i != splitted.length - 1)
allinone = allinone.concat(",");
}
}
else
{
float f = Float.parseFloat(splitted[0]);
pagerank = pagerank + f;
}
}
String last = Float.toString(pagerank);
last = last.concat(allinone);
LongWritable value = new LongWritable();
value.set(Long.parseLong(last));
results.collect(key, value);
}
}
public static void main(String[] args) throws Exception
{
org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "pagerank_itr0");
job.setJarByClass(Pagerank.class);
job.setMapperClass(Pagerank.PRMap.class);
job.setReducerClass(Pagerank.PRReduce.class);
job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(LongWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
job.waitForCompletion(true);
}
}
最佳答案
您没有在作业配置中设置映射器输出类。 尝试使用以下方法从 Job 设置键和值类:
setMapOutputKeyClass();
setMapOutputValueClass();
关于java - Hadoop 执行错误 : Type mismatch in key from map: expected org. apache.hadoop.io.Text,收到 org.apache.hadoop.io.LongWritable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14793828/
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候