我是新手,我有一个问题。我有一个两步过程,第一步是将SUCCESS.txt文件写入HDFS上的某个位置。我的第二步是一个spark作业,必须在开始处理数据之前验证该SUCCESS.txt文件是否存在。
我检查了spark API并没有找到任何检查文件是否存在的方法。任何想法如何处理这个?
我找到的唯一方法是sc.textFile(hdfs:///SUCCESS.txt).count(),当文件不存在时会抛出异常。我必须捕获该异常并相应地编写我的程序。我真的不喜欢这种方法。希望找到更好的选择。
答案 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