我有一个Spark数据框,其中列是整数:
MYCOLUMN:
1
1
2
5
5
5
6
目标是使输出等效于collections.Counter([1,1,2,5,5,5,6])
。我可以通过将列转换为RDD,调用collect和Counter来实现所需的结果,但对于大型数据帧来说这是相当慢的。
是否有更好的方法使用可以获得相同结果的数据帧?
答案 0 :(得分:2)
可能groupby
和count
与您需要的相似。这是我使用数据框计算每个数字的解决方案。我不确定这是否会比使用RDD更快。
# toy example
df = spark.createDataFrame(pd.DataFrame([1, 1, 2, 5, 5, 5, 6], columns=['MYCOLUMN']))
df_count = df.groupby('MYCOLUMN').count().sort('MYCOLUMN')
来自df_count.show()
的输出
+--------+-----+
|MYCOLUMN|count|
+--------+-----+
| 1| 2|
| 2| 1|
| 5| 3|
| 6| 1|
+--------+-----+
现在,您可以使用Counter
rdd
等词典
dict(df_count.rdd.map(lambda x: (x['MYCOLUMN'], x['count'])).collect())
这将输出为{1: 2, 2: 1, 5: 3, 6: 1}