apache spark - 检查文件是否存在

时间:2015-05-22 20:55:17

标签: hadoop apache-spark hdfs

我是新手,我有一个问题。我有一个两步过程,第一步是将SUCCESS.txt文件写入HDFS上的某个位置。我的第二步是一个spark作业,必须在开始处理数据之前验证该SUCCESS.txt文件是否存在。

我检查了spark API并没有找到任何检查文件是否存在的方法。任何想法如何处理这个?

我找到的唯一方法是sc.textFile(hdfs:///SUCCESS.txt).count(),当文件不存在时会抛出异常。我必须捕获该异常并相应地编写我的程序。我真的不喜欢这种方法。希望找到更好的选择。

8 个答案:

答案 0 :(得分:42)

对于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"))

答案 1 :(得分:8)

我会说,通过在传统的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)
    val exists = fs.exists(new org.apache.hadoop.fs.Path(hdfsDirectory))
    return exists
  }
}

答案 2 :(得分:7)

对于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"))

答案 3 :(得分:2)

使用 dbutils

def path_exists(path):
  try:
    if len(dbutils.fs.ls(path)) > 0:
      return True
  except:
    return False

答案 4 :(得分:1)

对于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.
           }

答案 5 :(得分:1)

对于 Spark 2.0或更高版本,您可以使用hadoop.fr.FileSystem
存在的方法:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ...
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Customer Details'))).click()

# css selector
# wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'a[href="https://mylink"]'))).click()

对于 Spark 1.6到2.0

import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.spark.sql.SparkSession

object Test extends App {
  val spark = SparkSession.builder
    .master("local[*]")
    .appName("BigDataETL - Check if file exists")
    .getOrCreate()

  val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)
  // This methods returns Boolean (true - if file exists, false - if file doesn't exist
  val fileExists = fs.exists(new Path("<parh_to_file>"))
  if (fileExists) println("File exists!")
  else println("File doesn't exist!")
}

答案 6 :(得分:0)

对于pyspark python用户:

我没有找到python或pyspark的任何内容,所以我们需要从python代码执行hdfs命令。这对我有用。

hdfs命令获取if文件夹是否存在:如果为true则返回0

hdfs dfs -test -d /folder-path

hdfs命令获取文件是否存在:如果为真则返回0

hdfs dfs -test -d /folder-path 

为了把它放在python代码中,我遵循下面的代码行:

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

答案 7 :(得分:0)

对于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