Pyspark:使用configParser读取HDFS上的属性文件

时间:2019-04-10 08:34:02

标签: hadoop pyspark hdfs pyspark-sql

我正在使用ConfigParser读取传递给我的pyspark程序的键值。当我从hadoop集群的边缘节点执行时,代码配置良好,并且配置文件位于边缘节点的本地目录中。如果配置文件已上传到hdfs路径,而我尝试使用解析器访问该文件,则不会。

配置文件para.conf具有以下内容

[tracker]
port=9801

在本地客户端模式下,在本地目录中具有para.conf,以使用以下内容访问我正在使用的值。

from ConfigParser import SafeConfigParser
parser = SafeConfigParser()
parser.read("para.conf")
myport = parser.get('tracker', 'port')

上面的方法很好...

在Hadoop群集上: 将para.conf文件上传到hdfs目录路径bdc / para.conf

parser.read("hdfs://clusternamenode:8020/bdc/para.conf")

这什么都不返回,下面的转义也不会返回。

parser.read("hdfs:///clusternamenode:8020//bdc//para.conf")

尽管使用sqlCOntext,我仍可以读取此文件,该文件将返回有效的rdd。

sc.textFile("hdfs://clusternamenode:8020/bdc/para.conf")

尽管不确定使用configParser是否可以从中提取键值。

任何人都可以建议configParser是否可用于从hdfs读取文件吗?还是有其他选择?

1 个答案:

答案 0 :(得分:0)

我已经复制了您在注释中提供的大多数代码。您真的很接近解决方案。您的问题是sc.textFile在rdd中为每个换行符产生一行。调用.collect()时,将获得文档每一行的字符串列表。 StringIO不需要列表,它需要一个字符串,因此您必须从列表中还原以前的文档结构。请参见下面的工作示例:

import ConfigParser 
import StringIO 
credstr = sc.textFile("hdfs://clusternamenode:8020/bdc/cre.conf").collect() 
buf = StringIO.StringIO("\n".join(credstr)) 
parse_str = ConfigParser.ConfigParser() 
parse_str.readfp(buf) 
parse_str.get('tracker','port') 

输出:

'9801'