Pyspark:获取HDFS路径上的文件/目录列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pyspark:获取HDFS路径上的文件/目录列表相关的知识,希望对你有一定的参考价值。

与标题相同。我知道textFile,但顾名思义,它仅适用于文本文件。我需要访问HDFS路径(或本地路径)内的文件/目录。我正在使用pyspark

感谢您的帮助

答案

我相信,仅将Spark视为数据处理工具是有用的,其域从加载数据开始。它可以读取多种格式,并且支持Hadoop glob表达式,这对于从HDFS中的多个路径读取非常有用,但是它没有我知道的用于遍历目录或文件的内置工具,也没有与Hadoop或HDFS交互专用的实用程序。

[有一些可用的工具可以执行您想要的操作,包括esutilhdfs。 hdfs库同时支持CLI和API,您可以直接跳至“如何在Python中列出HDFS文件”右侧here。看起来像这样:

from hdfs import Config
client = Config().get_client('dev')
files = client.list('the_dir_path')
另一答案

使用JVM网关可能不太好用,但是在某些情况下,以下代码可能会有所帮助:

URI           = sc._gateway.jvm.java.net.URI
Path          = sc._gateway.jvm.org.apache.hadoop.fs.Path
FileSystem    = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem
Configuration = sc._gateway.jvm.org.apache.hadoop.conf.Configuration


fs = FileSystem.get(URI("hdfs://somehost:8020"), Configuration())

status = fs.listStatus(Path('/some_dir/yet_another_one_dir/'))

for fileStatus in status:
    print(fileStatus.getPath())
另一答案

如果使用PySpark,则可以执行命令交互式


列出所选目录中的所有文件:

[hdfs dfs -ls <path>,例如:hdfs dfs -ls /user/path

import os
import subprocess

cmd = 'hdfs dfs -ls /user/path'
files = subprocess.check_output(cmd, shell=True).strip().split('
')
for path in files:
  print path

或在选定目录中搜​​索文件:

[hdfs dfs -find <path> -name <expression>,例如:hdfs dfs -find /user/path -name *.txt

import os
import subprocess

cmd = 'hdfs dfs -find {} -name *.txt'.format(source_dir)
files = subprocess.check_output(cmd, shell=True).strip().split('
')
for path in files:
  filename = path.split(os.path.sep)[-1].split('.txt')[0]
  print path, filename
另一答案

如果要读取目录中的all个文件,请签出sc.wholeTextFiles [doc],但请注意,文件的内容被读入单行的值中,这可能不是期望的结果。

[如果只想读取一些文件,则生成路径列表(使用普通的hdfs ls命令以及所需的任何过滤),并将其传递到sqlContext.read.text [doc],然后从DataFrame转换为RDD似乎是最好的方法。

另一答案

使用蛇咬库有一种简便的方法

from snakebite.client import Client

hadoop_client = Client(HADOOP_HOST, HADOOP_PORT, use_trash=False)

for x in hadoop_client.ls(['/']):

...     print x
另一答案

这些解决方案都无法直接为我服务。这可能对您有用:

import subprocess, re
def listdir(path):
    files = str(subprocess.check_output('hdfs dfs -ls ' + path, shell=True))
    return [re.search(' (/.+)', i).group(1) for i in str(files).split("\n") if re.search(' (/.+)', i)]

listdir('your/hdfs/path')

以上是关于Pyspark:获取HDFS路径上的文件/目录列表的主要内容,如果未能解决你的问题,请参考以下文章

Databricks 上的 PySpark 在绝对 URI 中获取相对路径:尝试使用 DateStamps 读取 Json 文件时

使用Java API操作HDFS时,_方法用于获取文件列表?

如何判断hdfs(hadoop)上的路径是文件还是目录。

hdfs怎么查看目录路径

HDFS

从 Pyspark 访问 HDFS 失败