복붙노트

[HADOOP] Hadoop Sequence File에서 마지막으로 수정 한 날짜를 얻으려면 어떻게해야합니까?

HADOOP

Hadoop Sequence File에서 마지막으로 수정 한 날짜를 얻으려면 어떻게해야합니까?

BinaryFiles (jpegs)를 Hadoop Sequence File (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에서이를 가져올 수있는 방법이 있습니까? 나는 자바에 멍청하다. 티아!

해결법

  1. ==============================

    1.안녕하세요 당신이 원하는 매퍼에 입력 된 각 입력 파일 수정 시간을 생각합니다. mpkorstanje 솔루션에 몇 줄을 추가하면됩니다.

    안녕하세요 당신이 원하는 매퍼에 입력 된 각 입력 파일 수정 시간을 생각합니다. mpkorstanje 솔루션에 몇 줄을 추가하면됩니다.

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

    이 몇 가지 변경 사항을 통해 각 inputSlipt의 fileStatus를 가져올 수 있으며 나중에 프로세스에서 사용할 수 있도록 키에 추가하거나 multipleOutput을 축소 단계의 다른 곳으로 축소하여 쓸 수 있습니다.

    이게 도움이되기를 바란다.

  2. ==============================

    2.Hadoop을 많이 사용하지는 않았지만 file.lastModified ()를 사용해야한다고 생각하지 않습니다. Hadoop은 파일 시스템을 다소 추상화했습니다.

    Hadoop을 많이 사용하지는 않았지만 file.lastModified ()를 사용해야한다고 생각하지 않습니다. Hadoop은 파일 시스템을 다소 추상화했습니다.

    map에서 FileSystem.getFileStatus (path)를 사용해 보셨습니까? 수정 시간이있는 FileStatus 객체를 가져옵니다. 좋아요.

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

    3.다음 코드 스 니펫을 사용하여 제공 한 특정 디렉토리 경로 아래에서 수정 된 모든 파일의 맵을 가져옵니다.

    다음 코드 스 니펫을 사용하여 제공 한 특정 디렉토리 경로 아래에서 수정 된 모든 파일의 맵을 가져옵니다.

    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;
    }
    
  4. ==============================

    4.Hadoop에서 각 파일은 BLOCK으로 구성됩니다. 일반적으로 Hadoop FileSystem은 org.apache.hadoop.fs 패키지로 참조됩니다. 입력 파일이 HDFS에있는 경우 위의 패키지를 가져와야 함을 의미합니다

    Hadoop에서 각 파일은 BLOCK으로 구성됩니다. 일반적으로 Hadoop FileSystem은 org.apache.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);
    

    이게 당신을 도울 수 있기를 바랍니다.

  5. from https://stackoverflow.com/questions/26936932/how-do-i-get-last-modified-date-from-a-hadoop-sequence-file by cc-by-sa and MIT license