首先,我将解释我想要做的事情。首先,我将输入文件(第一个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();
}
}
}
答案 0 :(得分:0)
您正在使用映射器代码阅读CSV文件。
如果您使用路径在mapper中打开文件,我猜您使用的是分布式缓存,那么只有文件会随jar一起提供给应该运行map reduce的每个节点。
有一种方法可以合并,但不能在映射器中使用。
您可以尝试以下方法: -
1)为两个不同的文件写2个单独的映射器。
2)仅将mapper所需的字段发送到reducer。
3)在reducer中组合结果(因为你想加入一些特定的键)。 您可以查看多输入格式示例以获取更多信息。