hadoop - Pyspark:使用 configParser 读取 HDFS 上的属性文件
问题描述
我正在使用 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 读取文件?还是有其他选择?
解决方案
我已经复制了您在评论中提供的大部分代码。你真的很接近解决方案。您的问题是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'
推荐阅读
- asp.net - 无法创建新的 VS 2013 网站解决方案
- python - 调用 fmin_l_bfgs_b 时出现 ValueError
- python - PyDev - 为什么我在同一目录中获得未解决的模块(文件)导入?
- emacs - 如何在 Emacs 中更改某个字符串的颜色?
- reactjs - handleChange = (e) => {} 和 handleButtonClick = () => | 为什么有'e'必须在()内,而有些不需要字母?
- javascript - 通过 vba 从 ie 触发 javascript
- python - “gensim.models.word2vec”没有属性“KeyedVectors”
- c++ - 在 std::unordered_map 中插入新的键/值对会导致“超出范围”异常
- spring - 表单提交后转发到 Spring Controller 中的 JSP
- javascript - 转换多个打开时间和减少单个打开时间的问题