PySpark 1.5 Groupby Sum 用于 Dataframe 中的新列

Posted

技术标签:

【中文标题】PySpark 1.5 Groupby Sum 用于 Dataframe 中的新列【英文标题】:PySpark 1.5 Groupby Sum for new column in Dataframe 【发布时间】:2016-03-07 16:45:49 【问题描述】:

我正在尝试使用 groupBy 和 sum(使用 PySpark 1.5)在 Spark Dataframe 中创建一个新列(“newaggCol”)。我的数字列已转换为 Long 或 Double。用于形成 groupBy 的列是 String 和 Timestamp。我的代码如下

df= df.withColumn("newaggCol",(df.groupBy([df.strCol,df.tsCol]).sum(df.longCol)))

我的错误回溯到了那一行。并说明:

ValueError: Cannot convert column into bool: please use '&' for 'and',     '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

我觉得我一定是调用函数不正确?

【问题讨论】:

【参考方案1】:

使用 SQL 聚合是不可能的,但您可以使用窗口函数轻松获得所需的结果

import sys
from pyspark.sql.window import Window
from pyspark.sql.functions import sum as sum_

w = (Window()
    .partitionBy(df.strCol, df.tsCol)
    .rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing))

df.withColumn("newaggCol", sum_(df.longCol).over(w))

【讨论】:

说我想通过一个新的分组获得那个 'newaggCol' 的分位数或百分位数。所以我创建 "new_window=(Window().partitionBy(strcol1,strcol2).orderBy(newaggCol)" THEN, "df.withColumn("pctl",percentRank().over(new_window))" ?? 如果你想要相同类型的结果,那么窗口应该保持原样。虽然请记住,这些都是昂贵的电话。 如果我想计算数字列“newaggCol”的离散百分位数或分位数(即 0.5、0.95)怎么办。我知道有一个“percentRank”,但这显然不会给出密集或连续的分位数。有没有办法使用UDF?我不知道如何使用这些? 有一个分位数离散化器,但它不能按组工作。您可能会发现这很有用***.com/q/32827643/1560062

以上是关于PySpark 1.5 Groupby Sum 用于 Dataframe 中的新列的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark - 使用 groupby 计算中值绝对百分比误差

是在单个 groupBy 中还是分别进行所有聚合?

如何将 groupBy 和聚合函数应用于 PySpark DataFrame 中的特定窗口?

pyspark:聚合列中最频繁的值

Parquet 文件上 groupby 的最佳实践

如何在 Pyspark 中计算或管理流数据