在PySpark中使用countByKey()后如何排序RDD



我有一个RDD,其中我使用countByvalue()来计算数据中作业类型的频率。这已经以键对的形式输出了(jobType, frequency)。

freq_per_job=previous_val.map(lambda x:x[3]).countByValue()

这里lambda用于映射位于[3]位置的作业类型。

然后我希望将作业类型加起来并输出前10个作业类型,但是我似乎无法做到这一点。我已经尝试使用sortByKey(false),但我一直得到以下错误:

AttributeError: 'collections.defaultdict' object has no attribute 'sortByKey'

我是pyspark的新手,所以我不确定如何解决这个问题。

嗨,它不是作为countByValue返回字典而不是RDD,而sortByKey等是一个RDD函数,所以有2种方法有RDD

  1. 将按值计数字典转换回RDD(对于大数据不建议,因为它是在驱动程序中收集的):
freq_per_job=previous_val.map(lambda x:x[3]).countByValue()
freq_per_job_rdd=sc.parallelize(list(freq_per_job.countByValue().items()))
freq_per_job_rdd.sortByKey().collect()
  1. 使用map和reduceByKey,然后使用sortByKey:
freq_per_job=previous_val.map(lambda x:x[3]).map(lambda x :(x,1)).reduceByKey(_+_).sortByKey().collect()

如果你只是想要基于作业计数的前10条记录,那么你可以使用带有键的top

而不是sortbykey
freq_per_job=previous_val.map(lambda x:x[3]).map(lambda x :(x,1)).reduceByKey(_+_).top(10,key=lambda x: x[1]).collect()

最新更新