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?)
在 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?)