【问题标题】:Sort values in PySpark RDD without using sort() function不使用 sort() 函数对 PySpark RDD 中的值进行排序
【发布时间】:2018-03-28 17:17:26
【问题描述】:
a = sc.parallelize((11,7,20,10,1,7))

我想在不使用 sort() 函数的情况下按升序对元素进行排序。

我试过了:

def srt(a,b):
if a>b:
    i=a
    a=b
    b=i   

final=a.map(lambda x,y: srt(x,y))

我没有得到所需的结果。

我想得到

  (1,7,7,10,11,20)

谢谢。

【问题讨论】:

  • 为什么不能使用sort()?您的代码不起作用,因为 rdd.map() 是只有一个变量的函数。
  • 我只是想了解 map/filter/reduce 在 pyspark 中的工作原理。这就是为什么我试图在没有 sort() 函数的情况下对其进行排序

标签: sorting apache-spark pyspark rdd


【解决方案1】:

如果你真的想避免sort(),这是一种方法,但我完全不建议使用它。

首先调用zipWithUniqueId() 为每一行添加一个唯一的ID。然后反复将rdd中的最小值追加到一个列表中,直到列表的大小等于rddcount()

a = sc.parallelize((11,7,20,10,1,7))
a = a.zipWithUniqueId()

mins = []
curr_min = a.reduce(lambda x, y: x if x[0] < y[0] else y)
mins.append(curr_min)

while(len(mins) < a.count()):
    curr_min = a.filter(lambda x: all(x != m for m in mins))\
                .reduce(lambda x, y: x if x[0] < y[0] else y)
    mins.append(curr_min)
print([m[0] for m in mins])
#[1, 7, 7, 10, 11, 20]

这并没有真正对您的rdd 进行排序,但它会按排序顺序获取值。如果您愿意,您必须并行化输出以返回rdd。但正如我之前提到的,这不是解决这个问题的好方法。只需致电sort()

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2012-11-30
    • 2021-11-13
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多