【问题标题】:aggregate function in lit() of pyspark along with withColumnpyspark 的 lit() 中的聚合函数以及 withColumn
【发布时间】:2020-07-07 20:38:15
【问题描述】:

我在数据框中有列数量。我想在这个数据框中添加一个新列,每条记录都有min("Quantity")。我正在尝试在pyspark 中使用lit()。像下面的东西

df.withColumn("min_quant", lit(min(col("Quantity")))).show().

导致出现以下错误

grouping expressions sequence is empty, and `InvoiceNo` is not an aggregate function. 
Wrap (min(`Quantity`) AS `min_quant`) in windowing function(s) or wrap 

这是有效的:

df.withColumn("min_quant", lit(2)).show().

但是,我想要min(Quantity) 来代替这里的 2。我错过了什么吗?

【问题讨论】:

  • 它是聚合函数,但你在平原上使用它。寻找聚合数据的方法。
  • 我正在尝试将静态值 min(quantity) 添加到数据帧的所有行(假设最小数量为 5,我的所有行在 min_quant 列中的值应为 5)。就像我们如何将 current_date() 添加到 datafarme 的所有行 ----> df.withColumn("today", lit(current_date())).show(10,False)
  • 我试图理解为什么我不能用聚合函数来做到这一点

标签: apache-spark apache-spark-sql aggregate-functions pyspark-sql pyspark-dataframes


【解决方案1】:

请尝试使用窗口函数,因为 min() 函数需要聚合。

val windowSpec = Window.orderBy("InvoiceNo")

df.withColumn("min_quant", min("Quantity") over(windowSpec)).show() 

样本结果:

+---------+----+--------+---------+
|InvoiceNo|name|Quantity|min_quant|
+---------+----+--------+---------+
|        1| ABC|      19|        1|
|        1| ABC|       1|        1|
|        1| ABC|       8|        1|
|        1| ABC|     389|        1|
|        1| ABC|     196|        1|
|        2| CBD|      10|        1|
|        2| CBD|     946|        1|
|        3| XYZ|       3|        1|
+---------+----+--------+---------+

【讨论】:

  • 嗨 Anup,这给了我超过 invioce_no 规范的最低数量。而我正在尝试添加静态值。假设最少数量是 5,那么我所有的行都应该有 5 和 min_quant。就像我如何将 current_date 添加到“今天”列中的所有行 ----> df.withColumn("today", lit(current_date())).show(10,False)
  • 嗨,阿里,这不应该在 invoice_no 上占用最小数量,因为没有分区,这应该在数据帧上占用最小数量。我正在用示例结果编辑答案
  • 谢谢,阿努普。我得到了预期的输出,我也学习了窗口函数。
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2015-07-31
  • 2021-10-14
  • 2014-08-08
相关资源
最近更新 更多