如何在map/reduce作业上只输出一次标题作为配置单元导入的csv,而不是手动输入列名。
公共类mymapper扩展了mapper{
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
try {
InputStream is = new ByteArrayInputStream(value.toString().getBytes());
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
//....
doc.getDocumentElement().normalize();
// .......
//context.write(new Text("el_from \t Title \t External Link"), NullWritable.get());
// ....
String title = eElement.getElementsByTagName("title").item(0).getTextContent();
text = eElement.getElementsByTagName("text").item(0).getTextContent();
String id = eElement.getElementsByTagName("id").item(0).getTextContent();
for(int j = 0; j < externalLinks.length; j++)
{
Pattern prl = Pattern.compile("(http:\\/\\/www\\.|https:\\/\\/www\\.|http:\\/\\/|https:\\/\\/)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?");
Matcher ml = prl.matcher(externalLinks[j]);
if(ml.find()) {
MatchResult mlr = ml.toMatchResult();
context.write(new Text(id+","+title + ","+ mlr.group(0)), NullWritable.get());
}
}
}
}
} catch (Exception e) {
// LogWriter.getInstance().WriteLog(e.getMessage());
}
}
}`enter code here`
我得到的结果是这样的
3,阿格里科图拉,http://www.treccani.it
3,阿格里科图拉,http://www.wwf.it/client/render.aspx
我想要的结果就像下面的标题
id、标题、链接
3,阿格里科图拉,http://www.treccani.it
3,阿格里科图拉,http://www.wwf.it/client/render.aspx
1条答案
按热度按时间1zmg4dgp1#
您应该在文本文件上构建一个配置单元表,这将定义配置单元架构中的“头”,而不是配置单元表中的另一个随机行。更重要的是,map reduce不能保证头是文件中的第一行。
因此,如果需要,可以编写一个配置单元查询以输出到单独的csv文件
另外,spark可以读取xml,解析它,并写出带有标题的csv,我相信这对您的用例可能更好