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.
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"))
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
}
}
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"))
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.
}
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