在pyspark中的元组上执行地图

时间:2017-10-01 03:27:59

标签: apache-spark pyspark

我设法完成了我需要做的事情,使用Spark的Mllib(处理不同于以下/不相关),但我想知道是否还有其他方法可以完成我想要做的事情。

我有这样的数据......

[(0, ([7, 6, 1, 4, 5, 4, 4, 3, 7, 0], [2])), (8, ([7, 4, 8, 2, 2, 0, 2, 6, 4, 0], [7]))

我在两者上使用了zipWithIndex之后加入了两个不同的列表。

我想处理以上内容......

[(0, 7 * 2), (0, 6 * 2), (0, 1 * 2) ... etc

其中连接的zip索引值是键,值是第一个列表中每个元素与第二个列表中唯一元素的乘积。

这样的事情是可行的吗?

1 个答案:

答案 0 :(得分:3)

您可以使用flatMap并为每个元素返回元组列表:

rdd.flatMap(lambda x: [(x[0], i * x[1][1][0]) for i in x[1][0]]).collect()

# [(0, 14), (0, 12), (0, 2), (0, 8), (0, 10), (0, 8), (0, 8), (0, 6), (0, 14), (0, 0), (8, 49), (8, 28), (8, 56), (8, 14), (8, 14), (8, 0), (8, 14), (8, 42), (8, 28), (8, 0)]

为了更清楚,请为映射编写一个常规方法:

def list_mul(t):
    k, (l1, l2) = t
    return [(k, i*l2[0]) for i in l1]

rdd.flatMap(list_mul).collect()
# [(0, 14), (0, 12), (0, 2), (0, 8), (0, 10), (0, 8), (0, 8), (0, 6), (0, 14), (0, 0), (8, 49), (8, 28), (8, 56), (8, 14), (8, 14), (8, 0), (8, 14), (8, 42), (8, 28), (8, 0)]