Pyspark:如何检查HDFS中是否存在文件

8
我希望在使用SparkContext加载文件之前,能够检查这些文件是否存在于hdfs中。我使用的是pyspark。我尝试过os.system("hadoop fs -test -e %s" %path),但由于需要检查的路径很多,作业崩溃了。我还尝试过sc.wholeTextFiles(parent_path),然后按键过滤,但是由于parent_path包含了很多子路径和文件,也崩溃了。你能帮我吗?
3个回答

1
右边是Tristan Reid的话:
...(Spark)它可以读取许多格式,并支持Hadoop Glob表达式,这对于从HDFS中多个路径读取非常有用,但我不知道它是否具有内置设施以遍历目录或文件,也没有特定于与Hadoop或HDFS交互的实用程序。
无论如何,这是他对相关问题的回答:Pyspark:获取HDFS路径上的文件/目录列表 一旦您获得了目录中的文件列表,就很容易检查特定文件是否存在。
希望它能在某种程度上有所帮助。

0

一种可能的方法是使用hadoop fs -lsr your_path获取所有路径,然后检查你感兴趣的路径是否在该集合中。

关于你的崩溃,可能是由于所有对os.system的调用导致的,而不是特定于hadoop命令。有时调用外部进程可能会导致与未释放的缓冲区相关的问题,特别是I/O缓冲区(stdin/stdout)。

一个解决方案是对所有路径进行循环的bash脚本进行单个调用。你可以在代码中使用字符串模板创建脚本,在脚本中填充路径数组,写入并执行。

另外,切换到Python的subprocess模块可能也是一个好主意,它可以让你更精细地控制处理子进程。下面是os.system的等效代码:

process = subprocess.check_output(
        args=your_script,
        stdout=PIPE,
        shell=True
    )

请注意,您可以将 stdout 切换为文件句柄,以帮助您进行调试或使进程更加健壮。此外,除非您要调用实际脚本或使用特定于 shell 的内容(如管道或重定向),否则可以将 shell=True 参数切换为 False

0
你尝试过使用pydoop吗?exists函数应该可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接