pyspark:当数据高度倾斜时,如何按组计算?

时间:2017-07-05 19:37:33

标签: python apache-spark pyspark

我正在使用pyspark,我可以使用

加载我的parquet文件

df = sqlContext.read.parquet('/mypath/parquet_01')

数据包含各种变量(col1col2col3等),我想

  • 按变量col1分组
  • 算多少个笨蛋。每组都有
  • 按计数(及其各自的计数)返回最高的10组

我不想使用groupby,因为数据非常偏斜(某些col1组有很多障碍物)。似乎reduceByKey在这里是合适的,但我无法正确使用它。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

试试这个:

 df.select('col1').map(lambda x: (x,1)).reduceByKey(lambda a,b: a+b)

映射过程用于创建(键,值)对: 下面的lambda函数适用于col1

的每一行

转型如下:

 col1   ->  (col1, 1)
  a         (a,1)
  a         (a,1)
  b         (b,1)
  a         (a,1)
  b         (b,1)

现在,我们在键值对上调用reduceByKey(lambda a,b: a+b): 其中a, b是具有相同键的两个(键,值)对的值,它们被缩减为(键,a + b)。

所以,(a,1),(a,1)得到减少为(a,2)并且过程继续,直到只剩下一个'a'键,从而给我们计算键'a'

我们将留下这个:

  col1   ->  (col1, 1)  -> reducedByKey(key,value) 
      a         (a,1)      (a,3)
      a         (a,1)      (b,2)
      b         (b,1)
      a         (a,1)
      b         (b,1)

我认为groupBy应该更快,即使数据偏斜,reduceByKey也可能更慢。

我也会尝试:

 df.groupBy("col1").count()