web-dev-qa-db-fra.com

apache spark - vérifie si le fichier existe

Je suis nouveau pour susciter et j'ai une question. J'ai un processus en deux étapes dans lequel la première étape écrit un fichier SUCCESS.txt dans un emplacement sur HDFS. Ma deuxième étape, qui est un travail d'étincelle, doit vérifier si ce fichier SUCCESS.txt existe avant de commencer à traiter les données.

J'ai vérifié l'API spark et n'ai trouvé aucune méthode permettant de vérifier si un fichier existe. Des idées comment gérer cela?

La seule méthode que j'ai trouvée est sc.textFile (hdfs: ///SUCCESS.txt) .count () qui lève une exception lorsque le fichier n'existe pas. Je dois attraper cette exception et écrire mon programme en conséquence. Je n'ai pas vraiment aimé cette approche. En espérant trouver une meilleure alternative.

15
Chandra

Pour un fichier en HDFS, vous pouvez utiliser la méthode hadoop :

val conf = sc.hadoopConfiguration
val fs = org.Apache.hadoop.fs.FileSystem.get(conf)
val exists = fs.exists(new org.Apache.hadoop.fs.Path("/path/on/hdfs/to/SUCCESS.txt"))
34
DPM

Je dirai, meilleure façon d'appeler cette fonction via une fonction qui vérifie en interne la présence de fichier dans la vérification de fichier hadoop traditionnelle.

object OutputDirCheck {
  def dirExists(hdfsDirectory: String): Boolean = {
    val hadoopConf = new org.Apache.hadoop.conf.Configuration()
    val fs = org.Apache.hadoop.fs.FileSystem.get(hadoopConf)
    val exists = fs.exists(new org.Apache.hadoop.fs.Path(hdfsDirectory))
    return exists
  }
}
8
Murari Goswami

Pour Pyspark, vous pouvez y parvenir sans appeler un sous-processus utilisant quelque chose comme:

fs = sc._jvm.org.Apache.hadoop.fs.FileSystem.get(sc._jsc.hadoopConfiguration())
fs.exists(sc._jvm.org.Apache.hadoop.fs.Path("path/to/SUCCESS.txt"))
3
Rob H

Pour les codeurs Java; 

 SparkConf sparkConf = new SparkConf().setAppName("myClassname");
        SparkContext sparky = new SparkContext(sparkConf);       
        JavaSparkContext context = new JavaSparkContext(sparky);

     FileSystem hdfs = org.Apache.hadoop.fs.FileSystem.get(context.hadoopConfiguration());
            Path path = new Path(sparkConf.get(path_to_File));

            if (!hdfs.exists(path)) {
                 //Path does not exist.
            } 
         else{
               //Path exist.
           }
1
Neethu

Pour les utilisateurs de pyspark python:

je n'ai rien trouvé avec python ou pyspark, nous devons donc exécuter la commande hdfs à partir du code python. Cela a fonctionné pour moi.

commande hdfs pour obtenir si le dossier existe: renvoie 0 si vrai 

hdfs dfs -test -d /folder-path

commande hdfs à obtenir si le fichier existe: renvoie 0 si vrai

hdfs dfs -test -d /folder-path 

Pour mettre cela en code python, j’ai suivi les lignes de code suivantes: 

import subprocess

def run_cmd(args_list):
    proc = subprocess.Popen(args_list, stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
    proc.communicate()
    return proc.returncode

cmd = ['hdfs', 'dfs', '-test', '-d', "/folder-path"]
            code = run_cmd(cmd)
if code == 0:
    print('folder exist')
    print(code) 

Sortie si le dossier existe: 

le dossier existe 0

0
Avinav Mishra