【问题标题】:PySpark 1.5 Groupby Sum for new column in DataframePySpark 1.5 Groupby Sum 用于 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.

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

【问题讨论】:

    标签: python sql apache-spark pyspark apache-spark-sql


    【解决方案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?我不知道如何使用这些?
    • 有一个分位数离散化器,但它不能按组工作。您可能会发现这很有用stackoverflow.com/q/32827643/1560062
    猜你喜欢
    • 2021-08-25
    • 2019-12-09
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多