Как получить последнюю дату изменения из файла последовательности Hadoop?

Я использую картограф, который преобразует BinaryFiles (jpegs) в файл последовательности Hadoop (HSF):

    public void map(Object key, Text value, Context context) 
throws IOException, InterruptedException {

    String uri = value.toString().replace(" ", "%20");
    Configuration conf = new Configuration();

    FSDataInputStream in = null;
    try {
        FileSystem fs = FileSystem.get(URI.create(uri), conf);
        in = fs.open(new Path(uri));
        java.io.ByteArrayOutputStream bout = new ByteArrayOutputStream();
        byte buffer[] = new byte[1024 * 1024];

        while( in.read(buffer, 0, buffer.length) >= 0 ) {
            bout.write(buffer);
        }
        context.write(value, new BytesWritable(bout.toByteArray()));

у меня есть второй картограф, который читает HSF, таким образом:

public  class ImagePHashMapper extends Mapper<Text, BytesWritable, Text, Text>{

    public void map(Text key, BytesWritable value, Context context) throws IOException,InterruptedException {
        //get the PHash for this specific file
        String PHashStr;
        try {
            PHashStr = calculatePhash(value.getBytes());

и calculatePhash это:

        static String calculatePhash(byte[] imageData) throws NoSuchAlgorithmException {
        //get the PHash for this specific data
        //PHash requires inputstream rather than byte array
        InputStream is = new ByteArrayInputStream(imageData);
        String ph;
        try {
            ImagePHash ih = new ImagePHash();
            ph = ih.getHash(is);
            System.out.println ("file: " + is.toString() + " phash: " +ph);
        } catch (Exception e) {
            e.printStackTrace();
            return "Internal error with ImagePHash.getHash";
        } 

        return ph;

все это отлично работает,но я хочу, чтобы calculatePhash записал последнюю дату каждого jpeg. Я знаю, что могу использовать file.lastModified() чтобы получить последнюю измененную дату в файле, но есть ли способ получить это на карте или calculatePhash? Я нуб на Ява. ТИА!

4 ответов


Привет я думаю, что вы хотите, это время изменения каждого входного файла, который входит в свой маппер. Если это так, вам просто нужно добавить несколько строк в решение mpkorstanje:

FileSystem fs = FileSystem.get(URI.create(uri), conf);
long moddificationTime = fs
    .getFileStatus((FileSplit)context.getInputSplit())
    .getPath()).lastModified();

С помощью этих нескольких изменений вы можете получить fileStatus каждого inputSlipt, и вы можете добавить его в свой ключ, чтобы использовать его позже в своем процессе или сделать multipleOutput reduce и написать где-то еще в фазе reduce.

Я надеюсь, что это будет полезно


не использовали Hadoop много, но я не думаю, что вы должны использовать file.lastModified(). Hadoop несколько абстрагировал файловую систему.

вы пробовали использовать файловой системы.getFileStatus (path) на map? Это дает вам FileStatus


используйте следующий фрагмент кода, чтобы получить карту всех файлов, измененных по указанному пути к каталогу:

private static HashMap lastModifiedFileList(FileSystem fs, Path rootDir) {
    // TODO Auto-generated method stub
    HashMap modifiedList = new HashMap();
    try {

        FileStatus[] status = fs.listStatus(rootDir);
        for (FileStatus file : status) {
            modifiedList.put(file.getPath(), file.getModificationTime());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return modifiedList;
}

в Hadoop каждый файл состоит из блока. Обычно файловая система Hadoop называется package org.апаш.платформа Hadoop.fs. Если ваши входные файлы присутствуют в файловой системы HDFS означает, что вам нужно импортировать вышеуказанный пакет

FileSystem fs = FileSystem.get(URI.create(uri), conf);
in = fs.open(new Path(uri));

org.apache.hadoop.fs.FileStatus fileStatus=fs.getFileStatus(new Path(uri));
long modificationDate = fileStatus.getModificationTime();

Date date=new Date(modificationDate);
SimpleDateFormat df2 = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
String dateText = df2.format(date);

Я надеюсь, что это поможет вам.