Pyspark Spark中两种不同方法的比较:还原和排序

Pyspark Spark中两种不同方法的比较:还原和排序,pyspark,rdd,Pyspark,Rdd,假设我有以下RDD: alist=[('a',['1',2]],('b',['2',3]],('b',['8',5]],('b',['8',5]],('c',['4',22]],('a',['5',22]]) anRDD=sc.parallelize(列表) 我的任务是从每个字符串字母中获取具有最高int值的列表(列表的索引1)。如果有大量数据和大量不同的键(字符串字母),建议使用以下哪种方法 方法1: 导入操作符 def SORTANDTACK(列表): 排序(key=operator.it

假设我有以下RDD:

alist=[('a',['1',2]],('b',['2',3]],('b',['8',5]],('b',['8',5]],('c',['4',22]],('a',['5',22]])
anRDD=sc.parallelize(列表)
我的任务是从每个字符串字母中获取具有最高int值的列表(列表的索引1)。如果有大量数据和大量不同的键(字符串字母),建议使用以下哪种方法

方法1:

导入操作符
def SORTANDTACK(列表):
排序(key=operator.itemgetter(1),reverse=True)
返回列表[0]
reducedd=anRDD.reduceByKey(λa,b:a+b)
finalRDD=reducedd.map(λx:(x[0],sortAndTake(x[1]))
finalRDD.collect()
方法2:

def分区器(n): def分区器(x): 返回可移植_散列(x[0])%n 返回分区器_ def排序器(迭代器): oldKey=None cnt=0 对于迭代器中的项: 如果项目[0]!=oldKey: oldKey=项目[0] 收益项目 分区=anRDD.keyBy(lambda kv:(kv[0],kv[1][0][1])) 已分区。重新分区和SortWithinPartitions( numPartitions=2, partitionFunc=partitioner(2),升序=False) .map(λx:x[1]) .mapPartitions(排序器) (方法2的灵感来源于我之前提出的一个问题的公认答案(由zero323提供):)

根据我在第一种方法中的理解,如果我们得到了一个巨大的不同键值,那么在
reduceByKey
中的工作人员之间会有很多混乱,这可以使方法2更快(我不确定在方法2中使用
重分区和sortwithInputions时是否会发生同样的情况)

有什么见解吗?谢谢:)

我的任务是从每个字符串字母中获取具有最高int值的列表(列表的索引1)

如果是这样的话,两种方法都是非常低效的。相反,只需使用
max
,来
reduceByKey

从操作员导入itemgetter
从functools导入部分
anRDD.mapValues(itemgetter(0)).reduceByKey(partial(max,key=itemgetter(1)))
关于提议的两种方法:

  • 两者都会洗牌相同数量的数据
  • 第一个是效率较低的
    groupByKey
我的任务是从每个字符串字母中获取具有最高int值的列表(列表的索引1)

如果是这样的话,两种方法都是非常低效的。相反,只需使用
max
,来
reduceByKey

从操作员导入itemgetter
从functools导入部分
anRDD.mapValues(itemgetter(0)).reduceByKey(partial(max,key=itemgetter(1)))
关于提议的两种方法:

  • 两者都会洗牌相同数量的数据
  • 第一个是效率较低的
    groupByKey

我非常喜欢实现这一点的方式,我想知道如何将您提供的答案扩展到N个最大值,而不仅仅是最大值。您能提供一些见解吗?您可以用来获取topK。请注意,topK未排序。@MpizosDimitris您需要在此处使用稍微不同的方法。@zero323。所以你不会使用我在问题中得到的方法1?你能再指定一点吗?@MpizosDimitris我个人会使用二进制堆进行聚合。我非常喜欢实现这一点的方式,我想知道如何将你提供的答案扩展到N个最大值,而不仅仅是最大值。你能提供一些见解吗?你可以用来获取topK。请注意,topK未排序。@MpizosDimitris您需要在此处使用稍微不同的方法。@zero323。所以你不会使用我在问题中得到的方法1?你能再指定一点吗?@MpizosDimitris我个人会用二进制堆聚合。