Apache spark 在pyspark中对元组执行映射

Apache spark 在pyspark中对元组执行映射,apache-spark,pyspark,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) ... e

我使用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索引值是键,该值是第一个列表中每个元素与第二个列表中唯一元素的乘积


这样做可行吗?

您可以使用
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)]

特别感谢您的详细介绍和功能!