当前位置: 首页 > 面试题库 >

MRJob的多个输入

松高爽
2023-03-14
问题内容

我正在尝试学习将Yelp的Python
API用于MapReduce,MRJob。他们简单的单词计数器示例很有意义,但是我很好奇一个人如何处理涉及多个输入的应用程序。例如,将向量乘以矩阵,而不是简单地对文档中的单词进行计数。我想出了这个解决方案,它可以起作用,但是感觉很愚蠢:

class MatrixVectMultiplyTast(MRJob):
    def multiply(self,key,line):
            line = map(float,line.split(" "))
            v,col = line[-1],line[:-1]

            for i in xrange(len(col)):
                    yield i,col[i]*v

    def sum(self,i,occurrences):
            yield i,sum(occurrences)

    def steps(self):
            return [self.mr (self.multiply,self.sum),]

if __name__=="__main__":
    MatrixVectMultiplyTast.run()

该代码运行,./matrix.py < input.txt并且起作用的原因是,存储在input.txt中的矩阵按列存储,并且相应的向量值位于行的末尾。

因此,下面的矩阵和向量:

在此处输入图片说明

以input.txt表示为:

在此处输入图片说明

简而言之,我将如何更自然地将矩阵和向量存储在单独的文件中,然后将它们都传递给MRJob?


问题答案:

如果您需要针对另一个(或相同的row_i,row_j)数据集处理原始数据,则可以:

1)创建一个S3存储桶以存储数据副本。将此副本的位置传递到您的任务类,例如,以下代码中的self.options.bucket和self.options.my_datafile_copy_location。警告:不幸的是,似乎整个文件在处理之前必须先“下载”到任务计算机。如果连接变弱或加载时间太长,此作业可能会失败。这是一些Python
/ MRJob代码来执行此操作。

将其放在您的映射器函数中:

d1 = line1.split('\t', 1)
v1, col1 = d1[0], d1[1]
conn = boto.connect_s3(aws_access_key_id=<AWS_ACCESS_KEY_ID>, aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>)
bucket = conn.get_bucket(self.options.bucket)  # bucket = conn.get_bucket(MY_UNIQUE_BUCKET_NAME_AS_STRING)
data_copy = bucket.get_key(self.options.my_datafile_copy_location).get_contents_as_string().rstrip()
### CAVEAT: Needs to get the whole file before processing the rest.
for line2 in data_copy.split('\n'):
    d2 = line2.split('\t', 1)
    v2, col2 = d2[0], d2[1]
    ## Now, insert code to do any operations between v1 and v2 (or c1 and c2) here:
    yield <your output key, value pairs>
conn.close()

2)创建一个SimpleDB域,并将所有数据存储在那里。在boto和SimpleDB上阅读此处:http
:
//code.google.com/p/boto/wiki/SimpleDbIntro

您的映射器代码如下所示:

dline = dline.strip()
d0 = dline.split('\t', 1)
v1, c1 = d0[0], d0[1]
sdb = boto.connect_sdb(aws_access_key_id=<AWS_ACCESS_KEY>, aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>)
domain = sdb.get_domain(MY_DOMAIN_STRING_NAME)
for item in domain:
    v2, c2 = item.name, item['column']
    ## Now, insert code to do any operations between v1 and v2 (or c1 and c2) here:
    yield <your output key, value pairs>
sdb.close()

如果您有大量数据,则第二个选项可能会更好,因为它可以针对每一行数据而不是一次针对全部数据进行请求。请记住,SimpleDB值的最大长度不能超过1024个字符,因此,如果您的数据值比该值长,则可能需要通过某种方法进行压缩/解压缩。



 类似资料:
  • mrjob 可以让用 Python 2.5+ 来编写 MapReduce 作业,并在多个不同平台上运行,你可以: 使用纯 Python 编写多步的 MapReduce 作业 在本机上进行测试 在 Hadoop 集群上运行 使用 Amazon Elastic MapReduce (EMR) 在云上运行 一些重要功能: 在EMR,Google Cloud Dataproc,您自己的Hadoop群集或本

  • 问题内容: 我正在使用hadoop mapreduce,我想计算两个文件。我的第一个Map / Reduce迭代是给我一个文件,其文件具有ID号,如下所示: 我的目标是使用文件中的该ID与另一个文件相关联,并使用三重奏输出另一个:ID,Number,Name,如下所示: 但是我不确定使用Map Reduce是否是最好的方法。例如,使用文件读取器读取第二个输入文件并通过ID获得名称会更好吗?还是可以

  • 问题内容: 我正在使用logstash jdbc来保持mysql和elasticsearch之间的同步。一张桌子工作正常。但是现在我想对多个表执行此操作。我需要在终端中打开多个 每个查询都有一个选择查询,或者我们有更好的方法来进行查询,因此可以更新多个表。 我的配置文件 问题答案: 你绝对可以有多个单配置输入,然后参数化的,并在你的输出,这取决于表中的事件的来源。

  • 问题内容: 给定一个预测变量向量时,我有一个问题要处理两个输出。假设预测变量矢量看起来像,它是坐标,并且是附加到出现坐标的其他属性。基于这个预测变量集,我想进行预测。这是一个时间序列问题,我正在尝试使用多元回归解决。我的问题是如何设置keras,这可以在最后一层为我提供2个输出。 问题答案:

  • 我正在编写一些VBA代码,这些代码应该遍历特定文件夹中的所有Excel文件(文件夹名称总是格式化为月份年份,例如2020年5月)。在我的代码中,我还需要使用单独的“月份”和“年份”字符串,例如“五月”和“2020年”,以及日期格式mm/?? /yy例如5/?? /20(日期不重要,所以我只是把? 到目前为止,我使用让用户选择文件夹,我使用三次来获取字符串和日期。 有没有办法压缩它,让用户只需要做一

  • 本文向大家介绍python实现一行输入多个值和一行输出多个值的例子,包括了python实现一行输入多个值和一行输出多个值的例子的使用技巧和注意事项,需要的朋友参考一下 注:以下内容在python3中操作 一. 一行输入多个值 具体操作如下: 具体操作如下: 补充split( ): 二. 一行输出多个值 注:python中print()会自动换行,具体如下: 具体操作如下: 以上这篇python实现

  • 问题内容: 我正在尝试合并两个模型的输出,并使用keras顺序模型将它们作为第三模型的输入。型号1: 型号1: 型号3: 直到这里,我的理解是,来自两个模型的输出x和y被合并并作为第三模型的输入。但是当我全都喜欢的时候 in1和in2是尺寸为10000 * 750的两个numpy ndarray,其中包含我的训练数据,而np_res_array是相应的目标。 这给了我错误,因为“列表”对象没有属性

  • 问题内容: 我有一个logstash输入设置为 我需要将主题提供给Elasticsearch中的两个不同的索引。任何人都可以帮助我如何为此类任务设置输出。目前,我只能设置 我需要在同一elasticsearch例如两个指标说和,这将在未来对信息供给和 问题答案: 首先,您需要添加到输入中才能知道消息来自哪个主题 然后,您有两个选择,都涉及条件逻辑。首先是通过引入一个过滤器来根据主题名称添加正确的索