【问题标题】:Groupby function on Dataframe using conditions in Pyspark使用 Pyspark 中条件的 Dataframe 上的 Groupby 函数
【发布时间】:2020-10-20 07:48:21
【问题描述】:

我是 Spark 的新手,在应用基于条件的 groupby 函数时需要一些帮助。以下是我当前的输出

+----------+------------------+-----------------+----------+---------+------------+------+----------+--------+----------------+
|account_id|credit_card_Number|credit_card_limit|first_name|last_name|phone_number|amount|      date|    shop|transaction_code|
+----------+------------------+-----------------+----------+---------+------------+------+----------+--------+----------------+
|     12345|      123456789123|           100000|       abc|      xyz|  1234567890|  1000|01/06/2020|  amazon|             buy|
|     12345|      123456789123|           100000|       abc|      xyz|  1234567890|  1100|02/06/2020|    ebay|             buy|
|     12345|      123456789123|           100000|       abc|      xyz|  1234567890|   500|02/06/2020|  amazon|            sell|
|     12345|      123456789123|           100000|       abc|      xyz|  1234567890|   200|03/06/2020|flipkart|             buy|
|     12345|      123456789123|           100000|       abc|      xyz|  1234567890|  4000|04/06/2020|    ebay|             buy|
|     12345|      123456789123|           100000|       abc|      xyz|  1234567890|   900|05/06/2020|  amazon|             buy|
+----------+------------------+-----------------+----------+---------+------------+------+----------+--------+----------------+

我需要使用日期进行分组,除此之外,我还需要根据交易代码中的“买入”或“卖出”创建一个额外的余额列。

例如,对于第一行,金额为 1000,交易代码为“购买”,因此我从信用额度 (100000) 中减去 1000,并在新列中创建新值 90000。

对于第二行,我们有两个值,一个是买入(1100),另一个是卖出(500),这里我应该从前一行输出中减去 1100(即 90000)加上 500。所以 02/06/2020 的输出是 98400

预期输出 附有上述数据框的附加列

Credit_left
99000
98400
98200
94200
93300

下面是这个表的架构

root
 |-- account_id: long (nullable = true)
 |-- credit_card_Number: long (nullable = true)
 |-- credit_card_limit: long (nullable = true)
 |-- first_name: string (nullable = true)
 |-- last_name: string (nullable = true)
 |-- phone_number: long (nullable = true)
 |-- amount: long (nullable = true)
 |-- date: string (nullable = true)
 |-- shop: string (nullable = true)
 |-- transaction_code: string (nullable = true)

这是一项如此复杂的任务,所以我找不到所需的答案。请帮助我解决这个问题。非常感谢!

【问题讨论】:

  • 您的输出与原始数据框的行数不同,不能作为新列追加
  • 我需要使用 date 应用 groupby 并且在应用 groupby 函数时我需要执行这个条件。因为我有两个相似的日期,我将对它们进行分组,因此最终输出将是 5 行
  • @keerthi007 你能给出一个可重现的数据样本吗?
  • 你能解释一下reproducibe data sample是什么意思吗?对不起,我是 Spark 的新手。非常感谢!

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


【解决方案1】:

解决方案可以实现为

from pyspark.sql import Window
from pyspark.sql.functions import *
import pyspark.sql.functions as f

w = Window.orderBy('date')

df.groupBy('date','credit_card_limit','credit_card_Number').agg(f.sum(f.when(f.col('transaction_code')=='buy',-f.col('amount')).\
              otherwise(f.col('amount'))).alias('expenses')).\
    select('*',(f.col('credit_card_limit')+f.sum(f.col('expenses')).over(w)).alias('Credit_left')).show()

----------+-----------------+------------------+--------+-----------+
|      date|credit_card_limit|credit_card_Number|expenses|Credit_left|
+----------+-----------------+------------------+--------+-----------+
|01/06/2020|           100000|      123456789123| -1000.0|    99000.0|
|02/06/2020|           100000|      123456789123|  -600.0|    98400.0|
|03/06/2020|           100000|      123456789123|  -200.0|    98200.0|
|04/06/2020|           100000|      123456789123| -4000.0|    94200.0|
|05/06/2020|           100000|      123456789123|  -900.0|    93300.0|
+----------+-----------------+------------------+--------+-----------+

希望对你有帮助:)

【讨论】:

  • Getting error as ' NameError: name 'f' is not defined ' I added ' import pyspark.sql.functions as f ' 到您的解决方案
  • 很好的解决方案!非常感谢您的支持:)
  • 我收到类似这样的警告'WARN WindowExec:没有为窗口操作定义分区!将所有数据移动到单个分区,这会导致严重的性能下降'这是一个大问题吗?如何克服?
  • 该警告只是为了提醒在数据偏斜的情况下会有不均匀的分区。因此,如果您的数据在所有分区中平均分布,那么您就可以开始了
  • 也可以参考这个问题stackoverflow.com/questions/41313488/…了解更多详情
猜你喜欢
  • 2021-10-07
  • 2019-08-11
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多