用Python进行流式传输以进行科学数据分析

时间:2013-10-22 07:24:19

标签: python hadoop streaming analysis

我刚开始在我的笔记本电脑上的单节点集群上使用hadoop,我尝试用Python做这件事,我比Java更了解。显然,流式传输是最简单的方法,无需安装任何其他软件包。

我的问题是,当我使用流媒体进行一些数据分析时,我不得不:

  1. 将我的数据(矩阵,数组......)转换为适合流式传输的默认输入文件格式的文本文件。
  2. 在我的mapper.py中重构我的数据,以明确(键,值)对并打印出来。
  3. 以文本格式阅读结果,然后转换为矩阵数据,以便我可以用它们做其他事情。
  4. 当您使用文本文件作为输入执行wordcount时,一切看起来都很好。但是你如何处理流媒体中的数据结构呢?我做的方式似乎是不可接受的......

2 个答案:

答案 0 :(得分:1)

对于python和hadoop,请查找MRjob包,http://pythonhosted.org/mrjob/

您可以将您的ouwn编码解码协议,流矩阵行编写为rownum-values对,或将每个元素编写为row:col-value对等等。

无论哪种方式,hadoop都不是处理矩阵运算的最佳框架,因为它设计用于大量非相关数据,即当你的键值处理不依赖于其他值时,或者取决于非常有限的方式。

答案 1 :(得分:0)

使用json作为文本格式可以非常方便地进行编码和解码。

例如,hdfs上的4 * 4单位矩阵可以存储为:

{"row":3, "values":[0,0,1,0]}
{"row":2, "values":[0,1,0,0]}
{"row":4, "values":[0,0,0,1]}
{"row":1, "values":[1,0,0,0]}

在映射器中,使用json库中的json.loads()将每行解析为python字典,这非常容易操作。然后返回一个键,然后返回更多json(使用json.dumps()将python对象编码为json):

1    {"values":[1,0,0,0]}
2    {"values":[0,1,0,0]}
3    {"values":[0,0,1,0]}
4    {"values":[0,0,0,1]}

在reducer中使用json.loads()对值创建python字典。例如,这些可以很容易地转换为numpy数组。