2014-11-14 18 views
7

Tôi đang sử dụng một ánh xạ có thể chuyển đổi BinaryFiles (JPEG) cho một chuỗi file Hadoop (HSF):Làm cách nào để có được ngày sửa đổi cuối cùng từ một Tệp chuỗi Hadoop?

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

sau đó tôi có một ánh xạ thứ hai mà đọc HSF, như sau:

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

và calculatePhash là:

 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; 

Tất cả đều hoạt động tốt, nhưng tôi muốn calculPhash ghi lại ngày sửa đổi cuối cùng của jpeg. Tôi biết tôi có thể sử dụng file.lastModified() để có được ngày sửa đổi cuối cùng trong một tập tin nhưng có cách nào để có được điều này trong bản đồ hoặc calculPhash? Tôi là một noob ở Java. TIA!

Trả lời

9

Hi tôi nghĩ rằng bạn muốn là lần sửa đổi của mỗi tập tin đầu vào vào trong người lập bản đồ của bạn. Nếu đó là trường hợp bạn chỉ cần thêm một vài dòng để các giải pháp mpkorstanje:

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

Với vài thay đổi này, bạn có thể nhận được fileStatus của mỗi inputSlipt và bạn có thể thêm nó vào chìa khóa của bạn để sử dụng sau này trong quá trình của bạn hoặc làm cho một multipleOutput giảm và viết ở một nơi khác trong giai đoạn giảm của bạn.

Tôi hy vọng điều này sẽ hữu ích

+2

Thêm mã vào khóa! Vì vậy, rõ ràng bây giờ. Cảm ơn!! – schoon

5

Chưa sử dụng Hadoop nhiều nhưng tôi không nghĩ bạn nên sử dụng file.lastModified(). Hadoop đã trừu tượng hóa hệ thống tệp.

Bạn đã thử sử dụng FileSystem.getFileStatus(path) trong map? Nó giúp bạn có một đối tượng FileStatus có thời gian sửa đổi. Một cái gì đó như

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

Sử dụng đoạn mã sau đây để có được đồ của tất cả các tập tin sửa đổi theo đường dẫn thư mục đặc biệt mà bạn cung cấp:

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

Trong Hadoop, mỗi tệp đều bao gồm BLOCK. Thông thường Hệ thống tệp Hadoop được gọi gói org.apache.hadoop.fs. Nếu tập tin đầu vào của bạn có mặt trong HDFS có nghĩa là bạn cần phải nhập khẩu các gói trên

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

Tôi hy vọng điều này sẽ giúp bạn.

+0

Nó hoạt động tốt – Rengasamy

+2

Sự khác nhau giữa các câu trả lời ở trên và của bạn là gì? Dường như cả hai đều giống nhau. – Kumar

Các vấn đề liên quan