Jak mogę uzyskać nazwę pliku wejściowego w programie odwzorowującym? Mam wiele plików wejściowych przechowywanych w katalogu wejściowym, każdy program odwzorowujący może czytać inny plik i muszę wiedzieć, który plik odczytał.Jak uzyskać nazwę pliku wejściowego w programie odwzorowującym w programie Hadoop?
Odpowiedz
Użyj tego wewnątrz odwzorowującym:
FileSplit fileSplit = (FileSplit)context.getInputSplit();
String filename = fileSplit.getPath().getName();
Edit:
Spróbuj tego, jeśli chcesz to zrobić wewnątrz configure() przez starego API:
Najpierw musisz uzyskać podział wejściowy, używając e nowsze mapreduce API byłoby to zrobić w następujący sposób:
context.getInputSplit();
Jednak aby uzyskać ścieżkę i nazwę pliku, trzeba będzie najpierw typecast wynik do FileSplit.
Tak, aby uzyskać ścieżkę pliku wejściowego można wykonać następujące czynności:
Path filePath = ((FileSplit) context.getInputSplit()).getPath();
String filePathString = ((FileSplit) context.getInputSplit()).getPath().toString();
Podobnie, aby uzyskać nazwę pliku, może po prostu wezwać getName() w następujący sposób:
String fileName = ((FileSplit) context.getInputSplit()).getPath().getName();
Musisz najpierw przekonwertować do InputSplit przez typowanie, a następnie musisz wpisać rzut do FileSplit.
Przykład:
InputSplit inputSplit= (InputSplit)context.getInputSplit();
Path filePath = ((FileSplit) inputSplit).getPath();
String filePathString = ((FileSplit) context.getInputSplit()).getPath().toString()
Jeśli używasz Hadoop Streaming, można użyć JobConf variables in a streaming job's mapper/reducer.
Co do nazwy pliku wejściowego odwzorowującym, zobacz sekcję Configured Parameters, zmienną map.input.file
(nazwę pliku, który mapa czyta z) jest tym, który może wykonać zadania. Należy jednak pamiętać, że:
Uwaga: Podczas wykonywania zadania przesyłania strumieniowego nazwy parametrów "odwzorowanych" są przekształcane. Kropki (.) Stają się podkreśleniami (_). Na przykład mapred.job.id staje się mapred_job_id, a mapred.jar staje się mapred_jar. Aby uzyskać wartości w programie odwzorowującym/redukującym zadania strumieniowania, należy użyć nazw parametrów z podkreślnikami.
Na przykład, jeśli używasz Python, a następnie można umieścić tę linię w pliku odwzorowujący:
import os
file_name = os.getenv('map_input_file')
print file_name
To działało lokalnie, ale w EMR przy użyciu przędzy, musiałem użyć sugestii w http://stackoverflow.com/questions/20915569/how-can-to-get-the-filename-from-a-streaming-mapreduce- job-in-r W szczególności: 'os.getenv ('mapreduce_map_input_file')' –
zauważony na Hadoop 2.4 i większa pomocą stare api metoda ta tworzy wartość null
String fileName = new String();
public void configure(JobConf job)
{
fileName = job.get("map.input.file");
}
Alternatywnie można wykorzystać obiekt Reporter przekazany do funkcji mapie, aby uzyskać InputSplit i obsady do FileSplit aby pobrać nazwę pliku
public void map(LongWritable offset, Text record,
OutputCollector<NullWritable, Text> out, Reporter rptr)
throws IOException {
FileSplit fsplit = (FileSplit) rptr.getInputSplit();
String inputFileName = fsplit.getPath().getName();
....
}
dla org.apache.hadood.mapred
pakietu mapa podpis funkcja powinna być:
map(Object, Object, OutputCollector, Reporter)
Tak więc, aby dostać t on nazwę pliku wewnątrz funkcji mapy, można użyć obiektu Reporter takiego:
String fileName = ((FileSplit) reporter.getInputSplit()).getPath().getName();
Jeśli używasz zwykłego InputFormat, to wykorzystać w swojej Mapper:
InputSplit is = context.getInputSplit();
Method method = is.getClass().getMethod("getInputSplit");
method.setAccessible(true);
FileSplit fileSplit = (FileSplit) method.invoke(is);
String currentFileName = fileSplit.getPath().getName()
Jeśli jesteś przy użyciu CombineFileInputFormat, jest to inne podejście, ponieważ łączy kilka małych plików w jeden stosunkowo duży plik (w zależności od konfiguracji). Zarówno Mapper, jak i RecordReader działają na tej samej maszynie JVM, dzięki czemu można przesyłać między nimi dane podczas pracy. Trzeba zaimplementować własną CombineFileRecordReaderWrapper i wykonaj następujące czynności:
public class MyCombineFileRecordReaderWrapper<K, V> extends RecordReader<K, V>{
...
private static String mCurrentFilePath;
...
public void initialize(InputSplit combineSplit , TaskAttemptContext context) throws IOException, InterruptedException {
assert this.fileSplitIsValid(context);
mCurrentFilePath = mFileSplit.getPath().toString();
this.mDelegate.initialize(this.mFileSplit, context);
}
...
public static String getCurrentFilePath() {
return mCurrentFilePath;
}
...
Następnie w Mapper, użyj tego:
String currentFileName = MyCombineFileRecordReaderWrapper.getCurrentFilePath()
nadzieję, że pomogło :-)
To pomogło mi:
String fileName = ((org.apache.hadoop.mapreduce.lib.input.FileSplit) context.getInputSplit()).getPath().getName();
- 1. Jak korzystać z kodu MATLAB w programie odwzorowującym (Hadoop)?
- 2. Jak uzyskać nazwę pliku wejściowego w MRjob
- 3. Jak załadować relację jeden-do-wielu w programie odwzorowującym dane?
- 4. Jak uzyskać zalogowaną nazwę użytkownika w programie Access vba?
- 5. Jak uzyskać nazwę kontrolera i akcji w programie OnActionExecuting?
- 6. jak uzyskać nazwę pliku wejściowego jako kolumna w kwerendzie kwarantanny
- 7. Nazwa pliku wyjściowego w programie Flash Builder
- 8. Zmień nazwę ograniczenia w programie SQL Server?
- 9. Zmień nazwę zdarzenia arkusza w programie Excel
- 10. Jak uzyskać HttpServletRequest w programie obsługi Ring?
- 11. Uzyskaj nazwę pliku z pliku wejściowego Angular2
- 12. Jak ustawić wewnętrzną nazwę SPField w programie SharePoint 2010?
- 13. Jak sortować tablice struktur w programie MATLAB?
- 14. Wywoływanie wyjątku wyjątku w programie hadoop map redukują program
- 15. Jak zmienić nazwę zasobu w programie Visual Studio?
- 16. knpmenubundle: Jak uzyskać dane użytkownika w programie budującym?
- 17. Używanie __DATA__ w programie
- 18. Odczyt z pliku CSV w programie MATLAB
- 19. Jak uzyskać dostęp do wartości kwerendy SQL() w programie Java
- 20. czytanie pliku XML w programie C++
- 21. Jak programowo uzyskać obraz kontaktu w programie Outlook 2010?
- 22. jak uzyskać datę i wartość czasu w programie C
- 23. Jak uzyskać wyjście z programu Exec w programie Inno Setup?
- 24. Jak przechwycić dostęp do pliku w programie .NET
- 25. Jak uzyskać nazwy kolumn do wydrukowania w tym programie C#?
- 26. Mycie w programie MakeScreenshot?
- 27. Co - w programie Excel?
- 28. nieoczekiwane "@" w programie (XCode)
- 29. widelec w wielowątkowym programie
- 30. Jak uzyskać nazwę trasy w programie obsługi za pomocą opcji route-route?
Próbuję użyć '' context'', ale nie ma metody o nazwie '' getInputSplit''. Czy używam starego API? Poza tym, czy mogę to zrobić w funkcji konfiguracji zamiast programu odwzorowującego? –
Zobacz powyższą edycję. – Tariq
Z najnowszym hadoop 2.6.0 to nie działa w mapreduce, możesz to zasugerować. – Raghuveer