在PySpark中转换RDD

时间:2016-04-27 11:41:32

标签: apache-spark pyspark rdd

例如,我有((i,j), k)类型的下一个RDD:

((0,0), 0)
((0,1), 0)
((1,0), 0)
((1,1), 0)

我想将其转换为另一个,1如果i==j。我的第一次尝试出错:

rddnew = rdd.flatMap(lambda ((i,j), k): [if i==j: ((i,j), 1)]))

有人可以帮我改进python中的这段代码吗?

1 个答案:

答案 0 :(得分:3)

这是一个解决方案:

data = [((0, 0), 0), ((0, 1), 0), ((1, 0), 0), ((1, 1), 0)]
rdd = sc.parallelize(data)
rdd2 = rdd.map(lambda ((i, j), _): ((i, j), 1) if (i == j) else ((i, j), 0))
rdd2.collect()
# [((0, 0), 1), ((0, 1), 0), ((1, 0), 0), ((1, 1), 1)]

您还可以使用mapper上的函数定义更清洁的解决方案:

def transformation(entry):
    (i, j), v = entry
    return (i, j), v + 1 if i == j else 0

rdd3 = rdd.map(transformation)
rdd3.collect()
# [((0, 0), 1), ((0, 1), 0), ((1, 0), 0), ((1, 1), 1)]