【问题标题】:Hadoop MapReduce output with header带有标头的 Hadoop MapReduce 输出
【发布时间】:2018-07-02 20:18:01
【问题描述】:

我怎样才能在我的 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,agricoltura,http://www.treccani.it

3,agricoltura,http://www.wwf.it/client/render.aspx

我想要的结果如下图所示

id、标题、链接

3,agricoltura,http://www.treccani.it

3,agricoltura,http://www.wwf.it/client/render.aspx

【问题讨论】:

  • 你能告诉我们你的尝试吗?
  • @Dragonthoughts 抱歉,我现在已经编辑了我的问题并添加了一段代码
  • 感谢@KlingKlang。是一个错字

标签: java csv hadoop mapreduce


【解决方案1】:

您应该在文本文件上构建一个 Hive 表,这将定义 Hive 架构中的“标题”,而不是 Hive 表中的另一个随机行。更重要的是,Map Reduce 不能保证你的标题是文件的第一行。

CREATE EXTERNAL TABLE x ( 
  id INT, title STRING, link STRING
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://mapred/outputDir';

如果需要,您可以编写 Hive 查询以输出到单独的 CSV 文件


此外,我相信,Spark 可以读取 XML、解析它并写出带有标题的 CSV,这可能更适合您的用例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多