我正在使用pyspark
,我可以使用
parquet
文件
df = sqlContext.read.parquet('/mypath/parquet_01')
数据包含各种变量(col1
,col2
,col3
等),我想
col1
分组我不想使用groupby
,因为数据非常偏斜(某些col1
组有很多障碍物)。似乎reduceByKey
在这里是合适的,但我无法正确使用它。
有什么想法吗?
谢谢!
答案 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()