在 PySpark 中转换 RDD
Transform RDD in PySpark
例如我有下一个类型为 ((i,j), k)
:
的 RDD
((0,0), 0)
((0,1), 0)
((1,0), 0)
((1,1), 0)
我想把它转换成另一个,如果 i==j
,它有 1
。我的第一次尝试出错了:
rddnew = rdd.flatMap(lambda ((i,j), k): [if i==j: ((i,j), 1)]))
有人可以帮我改进 python 中的这段代码吗?
这是一个解决方案:
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)]
您还可以通过在映射器上使用函数来定义更简洁的解决方案:
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)]
例如我有下一个类型为 ((i,j), k)
:
((0,0), 0)
((0,1), 0)
((1,0), 0)
((1,1), 0)
我想把它转换成另一个,如果 i==j
,它有 1
。我的第一次尝试出错了:
rddnew = rdd.flatMap(lambda ((i,j), k): [if i==j: ((i,j), 1)]))
有人可以帮我改进 python 中的这段代码吗?
这是一个解决方案:
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)]
您还可以通过在映射器上使用函数来定义更简洁的解决方案:
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)]