【发布时间】:2017-03-14 02:08:23
【问题描述】:
考虑一个 Spark DataFrame,其中我们有很少的列。目标是在不将其转换为 Pandas DataFrame 的情况下对其执行 groupBy 操作。等效的 Pandas groupBy 代码如下所示:
def compute_metrics(x):
return pd.Series({
'a': x['a'].values[0],
'new_b': np.sum(x['b']),
'c': np.mean(x['c']),
'cnt': len(x)
})
data.groupby([
'col_1',
'col_2'
]).apply(compute_metrics).reset_index()
我打算用 PySpark 写这个。到目前为止,我在PySpark 中提出了类似的内容:
gdf = df.groupBy([
'col_1',
'col_2'
]).agg({
'c': 'avg',
'b': 'sum'
}).withColumnRenamed('sum(b)', 'new_b')
但是,我不确定如何处理 'a': x['a'].values[0] 和 'cnt': len(x)。我曾想过使用from pyspark.sql import functions 中的collect_list,但这会用Column object is not Callable 打我的脸。知道如何完成上述转换吗?谢谢!
[UPDATE] 对 any 列执行count 操作以获得cnt 是否有意义?说我这样做:
gdf = df.groupBy([
'col_1',
'col_2'
]).agg({
'c': 'avg',
'b': 'sum',
'some_column': 'count'
}).withColumnRenamed('sum(b)', 'new_b')
.withColumnRenamed('count(some_column)', 'cnt')
【问题讨论】:
标签: pandas apache-spark pyspark