Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop wierd连接行为 目标_Java_Hadoop_Mapreduce - Fatal编程技术网

Java Hadoop wierd连接行为 目标

Java Hadoop wierd连接行为 目标,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我有两个csv文件试图在它们之间建立连接。一个包含movieId、title,另一个包含userId、movieId、comment标记。我想通过打印标题、评论数量,找出每部电影有多少评论标签。所以我的代码是: 司机 公共类驱动程序 { 公共驱动程序(字符串[]args) { 如果(参数长度

我有两个csv文件试图在它们之间建立连接。一个包含movieId、title,另一个包含userId、movieId、comment标记。我想通过打印标题、评论数量,找出每部电影有多少评论标签。所以我的代码是:

司机
公共类驱动程序
{
公共驱动程序(字符串[]args)
{
如果(参数长度<3){
System.err.println(“输入路径”);
}
试一试{
Job Job=Job.getInstance();
job.setJobName(“电影标签计数”);
//设置文件输入/输出路径
MultipleInputs.addInputPath(作业、新路径(args[1])、TextInputFormat.class、TagMapper.class);
MultipleInputs.addInputPath(作业、新路径(args[2])、TextInputFormat.class、MovieMapper.class);
setOutputPath(作业,新路径(args[3]);
//设置jar类名
job.setJarByClass(Driver.class);
//将映射器和还原器设置为作业
job.setReducerClass(Reducer.class);
//设置输出键类
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
int returnValue=job.waitForCompletion(true)?0:1;
System.out.println(job.issusccessful());
系统退出(返回值);
}捕获(IOException | ClassNotFoundException | InterruptedException e){
e、 printStackTrace();
}
}
}
电影制图员
公共类MovieMapper扩展org.apache.hadoop.mapreduce.Mapper
{
@凌驾
受保护的空映射(对象键、文本值、上下文)引发IOException、InterruptedException
{
字符串行=value.toString();
String[]items=line.split((?!\\B\“[^\”]*),(?![^\“]*\“\\B)”;//逗号不在引号中
字符串movieId=items[0]。trim();
if(tryparsent(电影ID))
{
write(新文本(movieId),新文本(items[1].trim());
}
}
私有布尔tryParseInt(字符串s)
{
试一试{
整数.parseInt(s);
返回true;
}捕获(数字格式){
返回false;
}
}
}
标记映射器
公共类标记映射器扩展org.apache.hadoop.mapreduce.Mapper
{
@凌驾
受保护的空映射(对象键、文本值、上下文)引发IOException、InterruptedException
{
字符串行=value.toString();
String[]items=line.split((?!\\B\“[^\”]*),(?![^\“]*\”\\B)”;
字符串movieId=items[1]。trim();
if(tryparsent(电影ID))
{
编写(新文本(movieId),新文本(“”);
}
}
私有布尔tryParseInt(字符串s)
{
试一试{
整数.parseInt(s);
返回true;
}捕获(数字格式){
返回false;
}
}
}
减速器
公共类Reducer扩展org.apache.hadoop.mapreduce.Reducer
{
@凌驾
受保护的void reduce(文本键、Iterable值、上下文上下文)引发IOException、InterruptedException
{
int noofffrequency=0;
Text movieTitle=新文本();
用于(文本o:值)
{
如果(o.toString().trim().equals(“”))
{
NooffFrequency++;
}
其他的
{
System.out.println(o.toString());
movieTitle=o;
}
}
context.write(movieTitle,新的intwriteable(noofffrequency));
}
}
问题 我得到的结果是这样的:

头衔

_,伯爵

头衔

头衔

_,伯爵

头衔

_,伯爵


这怎么会成为关键?我不明白。有一个if station检查是否有一个uu计数它,不要把它作为标题。toString()方法是否有问题,equals操作是否失败?有什么想法吗?

这并不奇怪,因为您迭代了
o
是指向
元素的指针,这里是
文本
。在某个时间点,您可以将
movieTitle
指向
o
movieTitle=o
。在下一个迭代中,
o
指向
”,并且
movieTitle
指向

如果您像这样更改代码,一切正常:

int noOfFrequency = 0;                                    
 Text movieTitle = null;                                  
for (Text o : values)                                     
{                                                         
    if(o.toString().trim().equals("_"))                   
    {                                                     
        noOfFrequency++;                                  
    }                                                     
    else                                                  
    {                                                     
        movieTitle = new Text(o.toString());              
    }                                                     
}                                                         
context.write(movieTitle, new IntWritable(noOfFrequency));
                                                      

非常感谢你!太明显了。。我应该想到这一点,但我认为hadoop处理线程的方式有问题。