我想在通过SparkContext加载之前检查hdfs中是否存在多个文件。
我用pyspark。我试过了
os.system("hadoop fs -test -e %s" %path)
但由于我有很多路要检查,这份工作崩溃了。
我还尝试了sc.wholeTextFiles(parent_path)
,然后按键过滤。但它崩溃也是因为parent_path包含很多子路径和文件。
你可以帮帮我吗?
答案 0 :(得分:1)
如何说Tristan Reid:
...(Spark)它可以读取多种格式,它支持Hadoop glob表达式,这对于从HDFS中的多个路径读取非常有用,但它没有我所知道的内置工具遍历目录或文件,也没有特定于与Hadoop或HDFS交互的实用程序。
无论如何,这是他对相关问题的回答:Pyspark: get list of files/directories on HDFS path
如果您拥有目录中的文件列表,则可以轻松检查特定文件是否存在。
我希望它能以某种方式提供帮助。
答案 1 :(得分:0)
您是否尝试过使用pydoop? exists
函数应该可以正常工作
答案 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的内容,例如管道或重定向。