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

Pyspark: Reading properties files on HDFS using configParser

我正在使用 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")

这没有 return 任何东西,下面的转义也没有..

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

虽然使用 sqlCOntext 我可以读取这个文件,它 return 是一个有效的 rdd。

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

虽然我不确定使用 configParser 是否可以从中提取键值..

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

我已经复制了您在评论中提供的大部分代码。你真的很接近解决方案。您的问题是 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'