Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Map-reduce功能大纲_Python_Functional Programming_Mapreduce_Scheme_Lisp - Fatal编程技术网

Python Map-reduce功能大纲

Python Map-reduce功能大纲,python,functional-programming,mapreduce,scheme,lisp,Python,Functional Programming,Mapreduce,Scheme,Lisp,注意:这只是一个基本的编程问题,与Hadoop或Map/Reduce“大数据处理”方法无关 让我们看一个序列(123445): 要将其映射到某个函数,比如说square,我可以执行以下操作: (define (map function sequence) ; apply the function to each element in the sequence ; we do not reduce it, but return a list (if (null? sequence)

注意:这只是一个基本的编程问题,与Hadoop或Map/Reduce“大数据处理”方法无关

让我们看一个序列
(123445)

要将其映射到某个函数,比如说
square
,我可以执行以下操作:

(define (map function sequence)
  ; apply the function to each element in the sequence
  ; we do not reduce it, but return a list
  (if (null? sequence)
      nil
      (cons (function (car sequence))
            (map function (cdr sequence)))))

(map (lambda (x) (* x x)) '(1 2 3 4 5))
; (1 4 9 16 25)
对于类似“map reduce”的东西,如果我们假设一个给定的序列,它可能有大约三个步骤(我想?):

  • map
  • filter
    (根据所做的操作,可以使用
    map
    交换顺序)
  • reduce
这是对“map-reduce”范式的正确理解吗?它通常是一个如下所示的函数:

mapreduce(map_function, filter_function, reduce_function, sequence)

或者在组合在一起时通常是如何处理的?

为了给您直观的感觉,我们需要(简单地)远离代码中的具体实现。MapReduce(我不只是谈论一个特定的实现)是关于问题的形状

假设我们有一个X的线性数据结构(列表、数组等等),我们有一个转换函数,我们想应用到它们中的每一个,我们有一个聚合函数,可以表示为关联成对组合的重复应用:

    xA           xB
     |           |
  xform(xA)   ​xform(xB)
       ​\       /
aggregator(xform(xA), xform(xB))
           ​|
         ​value
我们可以将聚合器递归地应用于整个列表/数组/xs中的任何内容:

    xA           xB               xC
     |           |                |
  xform(xA)   ​xform(xB)         xform(xC)
     |           |                |
     yA          yB               yC
       ​\       /                  |
aggregator(yA, yB)                |
           ​|                     /
         ​value                  /
           |                   /
          aggregator(value, yC)
                   |
              next_value
您要求使用Python或Scheme,但我发现如果使用类型,这一点更容易考虑。transformer
xform
接受一个类型为a的参数,并返回一个B:
(x:a)->B
。聚合器
aggregator
接受两个类型为B的参数,并返回一个B:
(x:B,y:B)->B

最简单的例子,也是经常被过度使用的例子,是平方和:

导入工具
#组合器
def添加(a、b):
返回a+b
#变压器
def square(a):
返回a*a
一到十=范围(1,11)
functools.reduce(添加,映射(正方形,一到十),0)
不太刺激。但是,这与代码中没有真正显示(但在图表中显示)的更直接版本不同的是,MapReduce版本是完全可并行的。您可以轻松地将其分块并在不同的线程、不同的框中运行部分内容。我们有变换,有组合函数,结合性意味着组合的顺序不重要

现在,并不是所有的问题都可以通过这种方式分解,但是有一个惊人的数字可以通过这种方式建模,并且它允许处理太大而无法在一个盒子上处理的数据集。显然,上面天真编写的Python不能做到这一点,至少今天不能。但是,一个足够聪明的编译器没有理由不发出字节码来实现这一点

虽然我不知道方案,但我知道Clojure,它确实提供了一个:

(需要“[clojure.core.reducers:as r])
(除方形[x](*x))
(r/折叠+(pmap方形(范围11)))

请注意,这并不是很完美:并行时的映射必须在(也是并行)组合发生之前完成,但我们正在接近,这些是标准的库调用。

我有点困惑,你到底想在这里找什么?@gold\u是一位非常熟悉上述数据/信号处理范例的人,他从结构上概述了数据/信号处理通常是如何完成的(我用scheme或python演示了一个示例……两种语言都可以)。哇,回答得很好。谢谢你这么多的心思和时间。但有一个问题:变量通常是如何完成的?例如
xA
xForm
xs
,等等@David542这并不重要。您可以选择任何想要的变量名。问题是你的问题真的可以被建模为一个递归的、关联的、成对的变换组合(即幺半群)?
    xA           xB               xC
     |           |                |
  xform(xA)   ​xform(xB)         xform(xC)
     |           |                |
     yA          yB               yC
       ​\       /                  |
aggregator(yA, yB)                |
           ​|                     /
         ​value                  /
           |                   /
          aggregator(value, yC)
                   |
              next_value