Pyspark:使用 configParser 读取 HDFS 上的属性文件
Posted
技术标签:
【中文标题】Pyspark:使用 configParser 读取 HDFS 上的属性文件【英文标题】:Pyspark: Reading properties files on HDFS using configParser 【发布时间】:2019-04-10 08:34:01 【问题描述】:我正在使用 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 读取文件?或者有没有其他选择?
【问题讨论】:
问题是ConfigParser不能处理hdfs文件路径。您可以做的是实现自己的 configreader 或使用bla = sc.textFile("hdfs://clusternamenode:8020/bdc/para.conf").collect()
读取,它会为您提供字符串列表。 configreader 可以处理带有read_string 的字符串。
read_string 不是选项,因为我使用的是 Python 2.7+ 。尝试按照***.com/questions/21766451/… buf = StringIO.StringIO(s_config) config = ConfigParser.ConfigParser() config.readfp(buf) 中的建议使用,但这给出了 no Section 错误!
您能否用您使用的代码扩展您的问题并完成您收到的错误消息?
使用 read_string 选项 import ConfigParser credstr = sc.textFile("hdfs://clusternamenode:8020/bdc/cre.conf").collect() parse_str=ConfigParser.ConfigParser() parse_str.read_string( credstr) 收到错误:AttributeError: ConfigParser instance has no attribute 'read_string'
使用文件缓冲选项` import ConfigParser import StringIO credstr = sc.textFile("hdfs://clusternamenode:8020/bdc/cre.conf").collect() buf = StringIO.StringIO(credstr ) parse_str = ConfigParser.ConfigParser() parse_str.readfp(buf) parse_str.get('tracker','port') ` 收到错误:- raise NoSectionError(section) ConfigParser.NoSectionError: No section: 'tracker'
【参考方案1】:
我已经复制了您在 cmets 中提供的大部分代码。你真的很接近解决方案。您的问题是 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'
【讨论】:
太棒了!这行得通:)我发现了一个非常糟糕的解决方案,通过使用列表元素和子字符串来获得我的价值......!现在将使用这个..谢谢!..以上是关于Pyspark:使用 configParser 读取 HDFS 上的属性文件的主要内容,如果未能解决你的问题,请参考以下文章
configparser.ConfigParser() read .ini 文件报错
configparser.ConfigParser() read .ini 文件报错