pyspark:如何检查hdfs中是否存在文件

时间:2015-09-01 14:53:40

标签: hadoop apache-spark filesystems hdfs pyspark

我想在通过SparkContext加载之前检查hdfs中是否存在多个文件。 我用pyspark。我试过了 os.system("hadoop fs -test -e %s" %path) 但由于我有很多路要检查,这份工作崩溃了。 我还尝试了sc.wholeTextFiles(parent_path),然后按键过滤。但它崩溃也是因为parent_path包含很多子路径和文件。 你可以帮帮我吗?

3 个答案:

答案 0 :(得分:1)

如何说Tristan Reid

  

...(Spark)它可以读取多种格式,它支持Hadoop glob表达式,这对于从HDFS中的多个路径读取非常有用,但它没有我所知道的内置工具遍历目录或文件,也没有特定于与Hadoop或HDFS交互的实用程序。

无论如何,这是他对相关问题的回答:Pyspark: get list of files/directories on HDFS path

如果您拥有目录中的文件列表,则可以轻松检查特定文件是否存在。

我希望它能以某种方式提供帮助。

答案 1 :(得分:0)

您是否尝试过使用pydoopexists函数应该可以正常工作

答案 2 :(得分: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=True参数切换为False,除非您要调用实际脚本或使用特定于shell的内容,例如管道或重定向。