2010-08-09 6 views
8

est-il un moyen de changer un objet chemin de Hadoop valide et existant dans un objet de fichier Java utile. Y a-t-il une bonne façon de le faire ou dois-je matraquer pour coder dans la soumission? Les approches les plus évidentes ne fonctionnent pas, et il semble que ce serait un peu de code ÀComment convertir un objet Path Hadoop dans un objet Java File

void func(Path p) { 
    if (p.isAbsolute()) { 
    File f = new File(p.toURI()); 
    } 
} 

Cela ne fonctionne pas parce que le chemin :: Touri() retourne l'identifiant « hdfs » et le fichier Java (URI uri) ne reconnaît que l'identificateur "file".

Y at-il un moyen d'obtenir chemin et le travailler ensemble?

**

Ok, que diriez-vous d'un exemple précis et limité. DistributedCache est censé fournir une copie localisée d'un fichier, mais il renvoie un chemin d'accès. Je suppose que DistributedCache faire une copie locale du fichier, où ils sont sur le même disque. Compte tenu de cet exemple limité, où hdfs n'est heureusement pas dans l'équation, y a-t-il un moyen pour moi de convertir de façon fiable un chemin dans un fichier?

**

+0

en supposant 'java.nio.file.Path' est acceptable (au lieu de' java.io.File'), [cette bibliothèque] (ht tps: //github.com/damiencarol/jsr203-hadoop) semble prometteur. – dimo414

Répondre

1

Pas que je sache.

À ma connaissance, un Path dans Hadoop représente un identificateur pour un noeud dans leur système de fichiers distribué. Ceci est une abstraction différente d'un java.io.File, qui représente un nœud sur le système de fichiers local. Il est peu probable qu'un Pathpouvait ont même une représentation File qui se comporterait de manière équivalente, parce que les modèles sous-jacents sont fondamentalement différents.

D'où le manque de traduction. Je suppose par votre assertion que File objets sont "[plus] utiles", vous voulez un objet de cette classe afin d'utiliser les méthodes de bibliothèque existantes? Pour les raisons ci-dessus, cela ne va pas très bien fonctionner. Si c'est votre propre bibliothèque, vous pouvez la réécrire pour qu'elle fonctionne correctement avec Hadoop Paths, puis convertir tous les fichiers en objets Path (cette direction fonctionne comme les chemins sont un surensemble strict de fichiers). Si c'est une bibliothèque tierce, alors vous n'avez pas de chance; les auteurs de cette méthode n'ont pas pris en compte les effets d'un système de fichiers distribué et ont seulement écrit cette méthode pour travailler sur de vieux fichiers locaux.

+5

Cette réponse est fausse: une Hadoop [path] (https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/Path.html) n'est pas un identificateur pour un noeud dans le système de fichiers Hadoop mais un fichier ou un répertoire dans n'importe quel système de fichiers.Hadoop [FileSystem] (https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html) est générique, ce qui signifie qu'il peut prendre en charge différents FileSystems, et pas seulement HDFS. C'est clairement écrit dans la documentation. La raison pour laquelle il n'y a pas de conversion d'un Hadoop 'Path' en Java' File' n'est pas parce qu'ils représentent deux abstractions différentes. – mariop

11

J'ai eu récemment cette même question, et il est vraiment un moyen d'obtenir un fichier à partir d'un chemin, mais il nécessite le téléchargement du fichier temporaire. De toute évidence, ce ne sera pas adapté à de nombreuses tâches, mais si le temps et l'espace ne sont pas essentiels pour vous, et vous avez juste besoin de travailler quelque chose en utilisant les fichiers de Hadoop, faire quelque chose comme ce qui suit:

import java.io.File; 
import java.io.IOException; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 

public final class PathToFileConverter { 
    public static File makeFileFromPath(Path some_path, Configuration conf) throws IOException { 
     FileSystem fs = FileSystem.get(some_path.toUri(), conf); 
     File temp_data_file = File.createTempFile(some_path.getName(), ""); 
     temp_data_file.deleteOnExit(); 
     fs.copyToLocalFile(some_path, new Path(temp_data_file.getAbsolutePath())); 
     return temp_data_file; 
    } 
} 
2

Si vous obtenez un LocalFileSystem

final LocalFileSystem localFileSystem = FileSystem.getLocal(configuration); 

vous pouvez passer votre Hadoop objet chemin vers localFileSystem.pathToFile

final File localFile = localFileSystem.pathToFile(<your hadoop Path>); 
Questions connexes