获取子目录列表

uttx8gqw  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(434)

我知道我能做到:

data = sc.textFile('/hadoop_foo/a')
data.count()
240
data = sc.textFile('/hadoop_foo/*')
data.count()
168129

但是,我想计算一下“/hadoop\u foo/”的每个子目录的数据大小。我能做到吗?
换句话说,我想要的是这样的:

subdirectories = magicFunction()
for subdir in subdirectories:
  data sc.textFile(subdir)
  data.count()

我试过:

In [9]: [x[0] for x in os.walk("/hadoop_foo/")]
Out[9]: []

但我认为它失败了,因为它搜索驱动程序的本地目录(在这种情况下是网关),而“/hadoop\u foo/”位于hdfs中。与“hdfs:///hadoop\u foo/”相同。
在阅读了如何为hdfs递归列出子目录之后,我想知道是否有一种方法可以执行:

hadoop dfs -lsr /hadoop_foo/

在代码中。。
从将两个浮点数写入常规txt的正确方式来看:

In [28]: os.getcwd()
Out[28]: '/homes/gsamaras'  <-- which is my local directory
wz8daaqr

wz8daaqr1#

与python一起使用hdfs模块;walk()方法可以获取文件列表。
代码应该是这样的:

from hdfs import InsecureClient

client = InsecureClient('http://host:port', user='user')
for stuff in client.walk(dir, 0, True):
...

使用scala可以获得文件系统( val fs = FileSystem.get(new Configuration()) )然后跑https://hadoop.apache.org/docs/r2.4.1/api/org/apache/hadoop/fs/filesystem.html#listfiles(org.apache.hadoop.fs.path,布尔值)
也可以使用os.subprocess从脚本中执行shell命令,但这不是推荐的方法,因为这里依赖shell实用程序的文本输出。
最终,对op有效的是使用subprocess.check\u output():

subdirectories = subprocess.check_output(["hadoop","fs","-ls", "/hadoop_foo/"])

相关问题