pyspark 中 lambda 内部的 For 循环

For-Loop inside of lambda in pyspark

在 pyspark 中使用 rdd.map(lambda x: .....) 我需要编写一个应该格式化字符串的 lambda 函数。

例如我有一个字符串 "abcdefgh" 并且在每列的每行中每两个符号之后我想插入“-”以获得 "ab-cd-ef-gh".

我如何使用带有正确 pyspark-syntaxis 的代码来实现它:

df.rdd.map(lambda x: ((for i in range(10): x[i+2:2] + "-"),)).toDF()

您的地图函数中存在一些语法错误。试试这个:

sc = spark.sparkContext

rdd = sc.parallelize(["abcdefg", "hijklmno"])  
rdd.collect()
# Out: ['abcdefg', 'hijklmno']

rdd.map(lambda x: '-'.join([x[i:i+2] for i in range(0, len(x), 2)])).collect()
# Out:['ab-cd-ef-g', 'hi-jk-lm-no']

或者:

from  itertools import zip_longest
rdd.map(lambda x: '-'.join(map(''.join, zip_longest(*[iter(x)]*2, fillvalue='')))) \
.collect()
# Out: ['ab-cd-ef-g', 'hi-jk-lm-no']

或更短:

from textwrap import wrap
rdd.map(lambda x: '-'.join(wrap(x, 2))).collect()
# Out: ['ab-cd-ef-g', 'hi-jk-lm-no']

(参见 Split string every nth character?