据我所知,没有现成的解决方案,而且我发现的大多数答案都诉诸于使用对hdfs
命令。我在 Linux 上运行,也面临同样的挑战。我找到了sh
包有用。它为您处理运行操作系统命令并管理标准输入/输出/错误。
请参阅此处了解更多信息:https://amoffat.github.io/sh/ https://amoffat.github.io/sh/
这不是最简洁的解决方案,但它是一行(左右)并使用标准包。
这是我获取 HDFS 目录列表的简化代码。它将列出类似的文件和文件夹,因此如果需要区分它们,您可能需要进行修改。
import sh
hdfsdir = '/somedirectory'
filelist = [ line.rsplit(None,1)[-1] for line in sh.hdfs('dfs','-ls',hdfsdir).split('\n') if len(line.rsplit(None,1))][1:]
我的输出 - 在这种情况下,这些都是目录:
[u'/somedirectory/transaction_basket_fct/date_id=2015-01-01',
u'/somedirectory/transaction_basket_fct/date_id=2015-01-02',
u'/somedirectory/transaction_basket_fct/date_id=2015-01-03',
u'/somedirectory/transaction_basket_fct/date_id=2015-01-04',
u'/somedirectory/transaction_basket_fct/date_id=2015-01-05',
u'/somedirectory/transaction_basket_fct/date_id=2015-01-06',
u'/somedirectory/transaction_basket_fct/date_id=2015-01-07',
u'/somedirectory/transaction_basket_fct/date_id=2015-01-08']
让我们来分解一下:
要运行hdfs dfs -ls /somedirectory
我们可以使用命令sh
像这样的包:
import sh
sh.hdfs('dfs','-ls',hdfsdir)
sh
允许您无缝调用操作系统命令,就像它们是模块上的函数一样。您将命令参数作为函数参数传递。真的很整洁。
对我来说,这会返回类似:
Found 366 items
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-01
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-02
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-03
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-04
drwxrwx---+ - impala hive 0 2016-05-10 13:52 /somedirectory/transaction_basket_fct/date_id=2015-01-05
使用以下命令根据换行符将其分成几行.split('\n')
使用以下命令获取字符串中的最后一个“单词”line.rsplit(None,1)[-1]
.
为了防止列表中的空元素出现问题,请使用if len(line.rsplit(None,1))
最后删除列表中的第一个元素(Found 366 items
) using [1:]