2015-06-12 39 views
-3

我们如何使用Map Reduce算法来检查数据文件中列的值是否符合给定条件?如何使用map reduce程序检查列的值是否与条件匹配?

例如:对于列C1我们要检查该列的值是否与条件C1 in ("A", "B", "C")匹配。

我希望的输出是将符合我的标准的行的所有标识符保存在表中,其他表中的其他表不匹配其他表。我当前的代码是:

public class SmallDataMap extends Mapper<Object, Text, Text, Text> {` 

    @Override 
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException { 

     String[] tokens = value.toString().split(","); 
     if (tokens.length != 8) { 
      return; 
     } 
     String gds = tokens[6]; 
     if (gds.equals("AMA") || (gds.equals("ABA"))) { 
      context.write(new Text(gds), new Text(tokens[0])); 
     } 

    } 
} 

主类的代码是:

public class SmallData { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws Exception { 

     Configuration conf = new Configuration(); 
     String[] ourArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
     Job job = Job.getInstance(conf, "Structuration par code gds"); 

     job.setJarByClass(SmallData.class); 
     job.setMapperClass(SmallDataMap.class); 

     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Text.class); 

     FileInputFormat.addInputPath(job, new Path(ourArgs[0])); 
     FileOutputFormat.setOutputPath(job, new Path(ourArgs[1])); 

     job.waitForCompletion(true); 
    } 
} 

我生成jar文件,当我试图在Cloudera的执行我的工作,我有这样的错误:

java.lang.RuntimeException: java.lang.ClassNotFoundException: Class smalldata.SmallDataMap not found 
+0

你的输入是如何存储在HDFS中的?当前的代码是什么,它不起作用?为什么它不起作用?什么是期望的输出?可能是降价是由于缺乏这种信息 – vefthym

回答

-1

首先介绍MapReduce的基本知识,以了解它是如何工作的。这不是一种算法,它是一种编程模型,可以用来编写自己的算法。我建议this tutorial开始。

之后,关于你的问题,你不需要一个reducer。只有地图的工作应该就足够了。您可以在映射器中应用您的标准并发布符合您标准的记录。

的映射器的伪代码很简单,只要:

map (LongWritable inputKey, Text inputValue){ //assuming value is stored as Text 
    String[] columns = inputValue.get().split(","); 
    if (columns.length != 8) return; //or throw IllegalArgumentException 
    C1 = columns[6]; 
    if (C1.equals("A") || C1.equals("B") || C1.equals("C")) { 
     emit (inputKey, inputValue); //assuming that you just need to keep the records which meet your criteria 
    } 
} 

有关详细信息,你可以阅读一些MapReduce的设计模式(也有book与包含过滤标准的例子一样,你是冠军描述)。

+0

为什么downvote?帮助我改进我的答案! – vefthym

+0

在我的情况下,我有一个csv文件,其中包含由逗号(“,”)分隔的8列,我会验证(A,B,C)中的列号7。 – Cleo

+0

在我的情况下,我有一个csv文件,其中包含由逗号(“,”)分隔的8列,我会验证(A,B,C)中的列号7。在这种情况下我如何应用你的答案?我没有在你的代码中注明这一行:'C1 = inputValue.extract(c1)'。另外,如果我将表中的c1与我的标准匹配的所有行的id保存为输入值,并且其他表中包含不匹配的行的其他表格 – Cleo

相关问题