我尝试在python中从HDFS导入文件列表。
如何从HDFS做到这一点:
path =r'/my_path'
allFiles = glob.glob(path + "/*.csv")
df_list = []
for file_ in allFiles:
df = pd.read_csv(file_,index_col=None, header=0,sep=';')
df_list.append(df)
我认为subprocess.Popen可以做到这一点,但是如何只提取文件名呢?
import subprocess
p = subprocess.Popen("hdfs dfs -ls /my_path/ ",
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
print(line)
输出如下:
b'Found 32 items\n'
b'-rw------- 3 user hdfs 42202621 2019-01-21 10:05 /my_path/file1.csv\n'
b'-rw------- 3 user hdfs 99320020 2019-01-21 10:05 /my_path/file2.csv\n'
2条答案
按热度按时间os8fio9y1#
声明人:这将是一个漫长而乏味的。但考虑到这种情况,我将尽可能使它具有通用性和可重复性。
考虑到没有外部库的要求(除了
pandas
?),没有必须的选择。我建议尽可能多地使用WebHDFS
。AFAIK,HDFS 的安装默认包括 WebHDFS 的安装。以下解决方案严重依赖于 WebHDFS。
第一步
开始,您必须了解 WebHDFS URL。WebHDFS 安装在HDFS Namenode上,默认端口为50070。
因此,我们从
http://[namenode_ip]:50070/webhdfs/v1/
开始,其中/webhdfs/v1
/是所有URL的公共URL。为了举例,我们假设它是
http://192.168.10.1:50070/web/hdfs/v1
。第二步
通常,可以使用
curl
来列出HDFS目录的内容。有关详细说明,请参阅WebHDFS REST API:列出目录如果您要使用
curl
,下面提供了给定目录中所有文件的FileStatuses
。如上所述,这将返回JSON对象中的FileStatuses:
使用python的默认库可以实现相同的结果:
如上所示,每个文件的实际状态比结果JSON低两个级别。换句话说,要获取每个文件的FileStatus:
第三步
既然您现在拥有了所需的所有信息,那么您所需要做的就是解析。
最终步骤
现在你知道文件和WebHDFS链接的路径,
pandas.read_csv
可以处理剩下的工作。现在,所有的
.csv
都导入并分配给了dfs
。警告
如果您的HDFS配置为HA(高可用性),则会有多个namenode,因此您的
namenode_ip
必须相应设置:它必须是活动节点的IP。ryhaxcpt2#
对这个问题的公认答案是我所能想象到的最糟糕的可能方法,是反人类罪。你可以用pyarrow读写。语法如下: