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

modify sign of numbers in two different columns of an RDD in PySpark

我正在研究 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) 中的数据符号相同,因此它们没有符号反转。

我该怎么做?

如果这本质上只是一个 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])))