Вывод Hadoop MapReduce с заголовком - PullRequest
0 голосов
/ 02 июля 2018

Как вывести заголовок на мою карту / сократить задание только один раз, чтобы использовать его как 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, title, link

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

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

1 Ответ

0 голосов
/ 03 июля 2018

Вы должны построить таблицу 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 с заголовками, как мне кажется, что может быть лучше для вашего варианта использования

...