Как получить последнюю дату изменения из файла последовательности 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);
Я надеюсь, что это поможет вам.