Pyspark:获取HDFS路径上的文件/目录列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pyspark:获取HDFS路径上的文件/目录列表相关的知识,希望对你有一定的参考价值。
与标题相同。我知道textFile,但顾名思义,它仅适用于文本文件。我需要访问HDFS路径(或本地路径)内的文件/目录。我正在使用pyspark
感谢您的帮助
我相信,仅将Spark视为数据处理工具是有用的,其域从加载数据开始。它可以读取多种格式,并且支持Hadoop glob表达式,这对于从HDFS中的多个路径读取非常有用,但是它没有我知道的用于遍历目录或文件的内置工具,也没有与Hadoop或HDFS交互专用的实用程序。
[有一些可用的工具可以执行您想要的操作,包括esutil和hdfs。 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 文件时