Python 3.x 如何在PythonSpark中正确使用带有两个输入和三个预期输出的enumerate
我一直在尝试在中复制代码,以便在pyspark中传输RDD。我能够正确加载我的RDD,并对其应用zipWithIndex方法,如下所示: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.
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):…
)。这种语法很脆弱,在Python3中已被删除。在Python 3中实现相同结果的正确方法是索引:Tuple[Any,Any]
如果您喜欢结构匹配,只需使用标准功能: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)
def flatten(xsi):
xs, i = xsi
for j, x in enumerate(xs):
yield i, j, x
rdd.flatMap(flatten)