Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 3.x 如何在PythonSpark中正确使用带有两个输入和三个预期输出的enumerate_Python 3.x_Apache Spark_Lambda_Pyspark_Enumerate - Fatal编程技术网

Python 3.x 如何在PythonSpark中正确使用带有两个输入和三个预期输出的enumerate

Python 3.x 如何在PythonSpark中正确使用带有两个输入和三个预期输出的enumerate,python-3.x,apache-spark,lambda,pyspark,enumerate,Python 3.x,Apache Spark,Lambda,Pyspark,Enumerate,我一直在尝试在中复制代码,以便在pyspark中传输RDD。我能够正确加载我的RDD,并对其应用zipWithIndex方法,如下所示: m1.rdd.zipWithIndex().collect() [(Row(c1_1=1, c1_2=2, c1_3=3), 0), (Row(c1_1=4, c1_2=5, c1_3=6), 1), (Row(c1_1=7, c1_2=8, c1_3=9), 2)] 但是,当我想将其应用于lambda枚举该数组的flatMap时,语法无效: m1.rdd.

我一直在尝试在中复制代码,以便在pyspark中传输RDD。我能够正确加载我的RDD,并对其应用zipWithIndex方法,如下所示:

m1.rdd.zipWithIndex().collect()
[(Row(c1_1=1, c1_2=2, c1_3=3), 0),
(Row(c1_1=4, c1_2=5, c1_3=6), 1),
(Row(c1_1=7, c1_2=8, c1_3=9), 2)]
但是,当我想将其应用于lambda枚举该数组的flatMap时,语法无效:

m1.rdd.zipWithIndex().flatMap(lambda (x,i): [(i,j,e) for (j,e) in enumerate(x)]).take(1)
或者,位置参数i显示为缺少:

m1.rdd.zipWithIndex().flatMap(lambda x,i: [(i,j,e) for (j,e) in enumerate(x)]).take(1)
在python中运行lambda时,它需要一个额外的索引参数来捕获函数

aa = m1.rdd.zipWithIndex().collect()
g = lambda x,i: [(i,j,e) for (j,e) in enumerate(x)]
g(aa,3) #extra parameter
在我看来,这似乎是不必要的,因为之前已经计算了指数


我是python和spark的业余爱好者,我想知道索引的问题是什么,以及为什么spark和python都没有抓住它们。多谢各位 RDD。FLASTMAP (<代码>保存分区> <代码>参数,为了清楚起见):

如您所见,
flatMap
需要一个

返回您的代码:

  • lambda x,i:…
    是一个,所以显然它不起作用
  • lambda(x,i):…
    用作具有的一元函数的语法。它使用结构匹配来分解单个输入参数(此处
    Tuple[Any,Any]
    )。这种语法很脆弱,在Python3中已被删除。在Python 3中实现相同结果的正确方法是索引:

    lambda xi: ((x[1], j, e) for e, j in enumerate(x[0]))
    
    如果您喜欢结构匹配,只需使用标准功能:

    def flatten(xsi):
        xs, i = xsi
        for j, x in enumerate(xs):
            yield i, j, x
    
    rdd.flatMap(flatten)
    

如果您的最终目标是转置rdd,请将其转换为块矩阵,将其转置并返回到rdd。
def flatten(xsi):
    xs, i = xsi
    for j, x in enumerate(xs):
        yield i, j, x

rdd.flatMap(flatten)