在PySpark中修改RDD的两个不同列中的数字符号

时间:2015-12-01 18:57:31

标签: python apache-spark pyspark rdd

我正在处理PySpark并且我有RDD,打印时看起来像这样:

[(-10.1571, -2.361), (-19.2108, 6.99), (10.1571, 4.47695), (22.5611, 20.360), (13.1668, -2.88), ....]

正如您所看到的,RDD中的每个元素都有两个数据。现在我要做的是检查两个数据的符号是否不同,然后反转第二个数据的符号以匹配第一个数据。例如 - 在(-19.2108, 6.99)中,两个数据的符号不同,因此我想反转6.99的符号使其成为-6.99,以便它与第一个数据的符号相匹配。但(-10.1571, -2.361)(22.5611, 20.360)中的数据符号相同,因此没有符号反转。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果这只是一个python的元组列表,只需检查第一个元素,你实际上并不关心第二个元素只需要匹配第一个元素:

l = [(-10.1571, -2.361), (-19.2108, 6.99), (10.1571, 4.47695), (22.5611, 20.360), (13.1668, -2.88)]

l[:] = [(a, -abs(b)) if a < 0 else (a, abs(b))for a, b in l]

print(l)

输出:

[(-10.1571, -2.361), (-19.2108, -6.99), (10.1571, 4.47695), (22.5611, 20.36), (13.1668, 2.88)]

查看文档地图可能会起到作用:

rdd1.map(lambda tup: (tup[0], -abs(tup[1])) if tup[0] < 0 else (tup[0], abs(tup[1])))