web-dev-qa-db-ja.com

apache spark-ファイルが存在するかどうかを確認

sparkが初めてです。質問があります。最初のステップでSUCCESS.txtファイルをHDFSの場所に書き込む2段階のプロセスがあります。2番目のステップは= sparkジョブは、データの処理を開始する前に、SUCCESS.txtファイルが存在するかどうかを確認する必要があります。

spark APIをチェックしましたが、ファイルが存在するかどうかをチェックするメソッドが見つかりませんでした。これを処理する方法はありますか?

私が見つけた唯一のメソッドはsc.textFile(hdfs:///SUCCESS.txt).count()で、ファイルが存在しない場合に例外をスローします。その例外をキャッチし、それに応じてプログラムを作成する必要があります。私はこのアプローチが本当に好きではありませんでした。より良い代替案を見つけることを望んでいます。

21
Chandra

HDFSのファイルの場合、 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"))
44
DPM

Pysparkの場合、次のようなものを使用してサブプロセスを呼び出すことなくこれを実現できます。

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"))
8
Rob H

これを、従来のhadoopファイルチェックでファイルの存在を内部的にチェックする関数を介して呼び出す最良の方法と言います。

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

Java coders;

 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.
           }
2
Neethu

Pyspark pythonユーザーの場合:

pythonまたはpysparkで何も見つからなかったので、pythonコードからhdfsコマンドを実行する必要があります。これは私にとってはうまくいきました。

フォルダーが存在する場合に取得するhdfsコマンド:trueの場合は0を返します

hdfs dfs -test -d /folder-path

ファイルが存在するかどうかを取得するhdfsコマンド:trueの場合は0を返します

hdfs dfs -test -d /folder-path 

これをpython code iに入れるには、コード行の下に続きます。

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) 

フォルダーが存在する場合の出力:

フォルダーが存在する0

0
Avinav Mishra

PySparkの場合:

from py4j.protocol import Py4JJavaError
def path_exist(path):
    try:
        rdd = sc.textFile(path)
        rdd.take(1)
        return True
    except Py4JJavaError as e:
        return False
0
Nandeesh