首页>Program>source

我是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。

对于第二行,我们有2个值,一个为buy(1100),另一个为sell(500),这里我应该从上一行的输出(即90000)中减去1100,再加上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)

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

最新回答
  • 10天前
    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|
    +----------+-----------------+------------------+--------+-----------+
    
    

    希望它会有所帮助:)

  • tfs:天蓝色devops跨域
  • casting:R浮点数精度在字符覆盖范围内丢失