如何在mapreduce中使用多个CSV文件

时间:2018-04-09 02:34:40

标签: java csv file-io mapreduce

首先,我将解释我想要做的事情。首先,我将输入文件(第一个CSV文件)放入mapreduce作业,其他CSV文件将放在mapper类中。但事情就是这样。 mapper类中的代码无法正常工作,就像右下角代码一样。我想组合两个CSV文件以在每个CSV文件中使用多个列。 例如,1个文件具有BibNum(用户帐户),checkoutdatetime(book checkoutdatetime)和itemtype(book itemtype),2个CSV文件具有BibNum(用户帐户),Title(书名),Itemtype等。我想知道下个月可能会借用哪本书。如果你知道如何结合两个CSV文件并启发我任何帮助,我将非常感激。如果您对我的代码有任何疑问,请告诉我,我会尽力澄清它。

 Path p = new Path("hdfs://0.0.0.0:8020/user/training/Inventory_Sample");
       FileSystem fs = FileSystem.get(conf);

       BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(p)));


        try {


            String BibNum = "Test";
            //System.out.print("test");
            while(br.readLine() != null){
                //System.out.print("test");
                if(!br.readLine().startsWith("BibNumber")) {
                    String subject[] = br.readLine().split(",");
                    BibNum = subject[0];
                }
            }

import java.io.BufferedReader;

import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.HashMap;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;



public class StubMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    private Text outkey = new Text();
    //private MinMaxCountTuple outTuple = new MinMaxCountTuple();

    //String csvFile = "hdfs://user/training/Inventory_Sample";
    @Override
    public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {


       Configuration conf = context.getConfiguration();
       //conf.addResource("/etc/hadoop/conf/core-site.xml");
       //conf.addResource("/etc/hadoop/conf/hdfs-site.xml");
       Path p = new Path("hdfs://0.0.0.0:8020/user/training/Inventory_Sample");
       FileSystem fs = FileSystem.get(conf);

       BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(p)));


        try {


            String BibNum = "Test";
            //System.out.print("test");
            while(br.readLine() != null){
                //System.out.print("test");
                if(!br.readLine().startsWith("BibNumber")) {
                    String subject[] = br.readLine().split(",");
                    BibNum = subject[0];
                }
            }

            if(value.toString().startsWith("BibNumber"))
            {
                return;
            }

            String data[] = value.toString().split(",");

            String BookType = data[2];
            String DateTime = data[5];

            SimpleDateFormat frmt = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");

            Date creationDate = frmt.parse(DateTime);
            frmt.applyPattern("dd-MM-yyyy");
            String dateTime = frmt.format(creationDate);

            //outkey.set(BookType + " " + dateTime);
            outkey.set(BibNum + " " + BookType + " " + dateTime);

            //outUserId.set(userId);
            context.write(outkey, new IntWritable(1));

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            br.close();
        }


    }
}

1 个答案:

答案 0 :(得分:0)

您正在使用映射器代码阅读CSV文件。

如果您使用路径在mapper中打开文件,我猜您使用的是分布式缓存,那么只有文件会随jar一起提供给应该运行map reduce的每个节点。

有一种方法可以合并,但不能在映射器中使用。

您可以尝试以下方法: -

1)为两个不同的文件写2个单独的映射器。

2)仅将mapper所需的字段发送到reducer。

3)在reducer中组合结果(因为你想加入一些特定的键)。  您可以查看多输入格式示例以获取更多信息。