2014-11-14 18 views
7

I (HSF) bir Hadoop Dizi Dosyasına BinaryFiles (JPEG) dönüştüren bir mapper kullanıyorum:Son değiştirilme tarihini Hadoop Sekans Dosyasından nasıl alabilirim?

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())); 

Sonra HSF okur ikinci bir mapper var, böylece:

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()); 

ve calculatePhash geçerli:

 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; 

Bu, tüm iyi çalışır, ancak calculatePhash her JPEG en son değiştirilme tarihini yazmak istiyorum. Ben dosyasındaki son değiştirilme tarihi almak için file.lastModified() kullanabilir ama harita veya calculatePhash birinde bu almak için herhangi bir yolu yoktur biliyoruz? Java'da noob var. TIA!

cevap

9

Merhaba ben istediğiniz düşünüyorum her giriş Dosya değişiklik zamanı haritanızda giriyor. Her inputSlipt ait fileStatus alabilirsiniz bu birkaç değişiklikle

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

ve daha sonra kullanmak için lütfen anahtarına ekleyebilirsiniz: Bu durumda sadece mpkorstanje çözümüne birkaç satır eklemek zorunda işleminizde veya çokluOutput azaltma aşamasında başka bir yere indirip yazabilirsiniz.

Bu

+2

anahtarına ekleyin! Şimdi çok açık. Teşekkürler!! – schoon

5

çok Hadoop kullanılmaz mı ama file.lastModified() kullanmak gerektiğini düşünüyorum. Hadoop dosya sistemini biraz soyutladı.

Eğer map yılında FileSystem.getFileStatus(path) kullanarak denediniz mi? Değişiklik zamanı olan bir FileStatus nesnesini alır.

FileSystem fs = FileSystem.get(URI.create(uri), conf); 
long moddificationTime = fs.getFileStatus(new Path(uri)).lastModified(); 
1

gibi bir şey sağladığınız belirli dizin yolu altındaki modifiye tüm dosyaların Haritası almak için aşağıdaki kod parçacığını kullanın:

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; 
} 
0

Hadoop, her dosyalar BLOK oluşur olan kullanışlı olacağını umuyoruz. Genel Hadoop'un Dosya Sistemi paketini org.apache.hadoop.fs adlandırılır. girişinizi dosyaları HDF'ler mevcut ise sen bu size yardımcı olacağını umuyoruz yukarıdaki paket

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); 

içe gerektiği anlamına gelir.

+0

Bu ince çalıştı mı? Her ikisi de aynı görünüyor. – Rengasamy

+2

Yukarıdaki cevaplar ve sizin arasındaki fark nedir – Kumar

İlgili konular