如何使用python脚本从hdfs(hadoop)目录中获取文件列表?
我尝试过以下行:
dir = sc.textFile(" hdfs://127.0.0.1:1900 / directory")。collect()
该目录包含文件列表" file1,file2,file3 .... fileN"。通过使用该行我只获得了所有内容列表。 但我需要获取文件名列表。
有人可以帮我找出这个问题吗?
提前致谢。
答案 0 :(得分:4)
使用子流程
import subprocess
p = subprocess.Popen("hdfs dfs -ls <HDFS Location> | awk '{print $8}",
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
print line
编辑:没有python的答案。第一个选项也可用于递归打印所有子目录。可以根据您的要求省略或更改最后一个重定向语句。
hdfs dfs -ls -R <HDFS LOCATION> | awk '{print $8}' > output.txt
hdfs dfs -ls <HDFS LOCATION> | awk '{print $8}' > output.txt
答案 1 :(得分:1)
import subprocess
path = "/data"
args = "hdfs dfs -ls "+path+" | awk '{print $8}'"
proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
s_output, s_err = proc.communicate()
all_dart_dirs = s_output.split() #stores list of files and sub-directories in 'path'
答案 2 :(得分:0)
对于python 3:
from subprocess import Popen, PIPE
hdfs_path = '/path/to/the/designated/folder'
process = Popen(f'hdfs dfs -ls -h {hdfs_path}', shell=True, stdout=PIPE, stderr=PIPE)
std_out, std_err = process.communicate()
list_of_file_names = [fn.split(' ')[-1].split('/')[-1] for fn in std_out.decode().readlines()[1:]][:-1]
list_of_file_names_with_full_address = [fn.split(' ')[-1] for fn in std_out.decode().readlines()[1:]][:-1]
答案 3 :(得分:0)
为什么HDFS客户端不使用-C
标志而不是依靠awk或python打印感兴趣的特定列来完成艰苦的工作?
即Popen(['hdfs', 'dfs', '-ls', '-C', dirname])
然后,将输出分成新行,然后将获得路径列表。
以下是有关日志记录和错误处理的示例(包括目录/文件不存在时的示例):
from subprocess import Popen, PIPE
import logging
logger = logging.getLogger(__name__)
FAILED_TO_LIST_DIRECTORY_MSG = 'No such file or directory'
class HdfsException(Exception):
pass
def hdfs_ls(dirname):
"""Returns list of HDFS directory entries."""
logger.info('Listing HDFS directory ' + dirname)
proc = Popen(['hdfs', 'dfs', '-ls', '-C', dirname], stdout=PIPE, stderr=PIPE)
(out, err) = proc.communicate()
if out:
logger.debug('stdout:\n' + out)
if proc.returncode != 0:
errmsg = 'Failed to list HDFS directory "' + dirname + '", return code ' + str(proc.returncode)
logger.error(errmsg)
logger.error(err)
if not FAILED_TO_LIST_DIRECTORY_MSG in err:
raise HdfsException(errmsg)
return []
elif err:
logger.debug('stderr:\n' + err)
return out.splitlines()
答案 4 :(得分:-3)
你可以在os库中使用listdir函数
files = os.listdir(path)