如何比较PySpark中的两个LabeledPoints?

时间:2016-01-21 23:48:17

标签: python apache-spark pyspark rdd

我有两个LabeledPoints - Prediction1Prediction2。这两个LabeledPoints都具有作为第一元素的值和作为第二元素的预测。我想检查first中的Prediction1元素是否等于first中的Prediction2元素。所以像这样:

for each value in Prediction1 and Prediction2:
     if Prediction1.tup[0] != Prediction2.tup[0]:
         print 'Value unequal'
         break

示例:

假设以下是RDD LabeledPoints的{​​{1}}:

Prediction1

[(1,2),(3,4),(5,6)]

Prediction2

在上面的示例中,[(1,12),(3,13),(5,2)] (1,3,5)的每个LabeledPoint的第一个元素等于Prediction1的每个LabeledPoint的第一个元素(1,3) ,5)。但即使其中一个没有匹配,那么我想退出流程并打印出他们不匹配并结束。

我如何在Prediction2

中执行此操作

1 个答案:

答案 0 :(得分:1)

假设两个RDD的每个分区具有相同数量的分区和元素,您只需ziptake

prediction1 = sc.parallelize([(1, 2), (3, 4), (5, 6)])
prediction2 = sc.parallelize([(1, 12), (3, 13), (5, 2)])
prediction3 = sc.parallelize([(1, 0), (5, 0), (5, 0)])

def mismatch(rdd1, rdd2):
    def mismatch_(xy):
        (x1, _), (y1, _) = xy
        return x1 != y1
    return bool(rdd1.zip(rdd2).filter(mismatch_).take(1))

mismatch(prediction1, prediction2)       
## False
mismatch(prediction1, prediction3)
## True

由于take是懒惰的,它应该或多或少地按预期工作。见Stevens' Advanced Programming in the Unix Environment

如果未达到初始条件,您可以zip,交换(zipWithIndex)和lambda kv: (kv[1], kv[0])手动join