Apache spark 使用Pyspark中的条件对数据帧执行Groupby函数
我是Spark新手,在应用基于条件的groupby函数时需要一些帮助。下面是我当前的输出Apache spark 使用Pyspark中的条件对数据帧执行Groupby函数,apache-spark,hadoop,pyspark,apache-spark-sql,Apache Spark,Hadoop,Pyspark,Apache Spark Sql,我是Spark新手,在应用基于条件的groupby函数时需要一些帮助。下面是我当前的输出 +----------+------------------+-----------------+----------+---------+------------+------+----------+--------+----------------+ |account_id|credit_card_Number|credit_card_limit|first_name|last_name|phone_n
+----------+------------------+-----------------+----------+---------+------------+------+----------+--------+----------------+
|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,交易代码为“购买”,因此我从credit limit100000中减去1000,并在新列中创建一个新值90000
对于第二行,我们有两个值,一个是buy1100,另一个是sell500,这里我应该从前一行outputi.e 90000中减去1100,再加上500。因此,2020年6月2日的产量为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)
这是一个如此复杂的任务,所以我找不到这个问题所需的答案。请帮助我解决这个问题。非常感谢 该解决方案可按以下方式实施:
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|
+----------+-----------------+------------------+--------+-----------+
希望有帮助:解决方案可以按如下方式实施
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|
+----------+-----------------+------------------+--------+-----------+
希望有帮助:您的输出的行数与原始数据框的行数不同,无法作为新列追加。我需要使用日期应用groupby,在应用groupby函数时,我需要执行此条件。因为我有两个相似的日期,我将对它们进行分组,因此最终输出为5rows@keerthi007你能给出一个可复制的数据样本吗?你能解释一下你所说的可复制的数据样本是什么意思吗?对不起,我是个新手,非常感谢!您的输出的行数与原始数据框的行数不同,无法作为新列追加。我需要使用日期应用groupby,在应用groupby函数时,我需要执行此条件。因为我有两个相似的日期,我将对它们进行分组,因此最终输出为5rows@keerthi007你能给出一个可复制的数据样本吗?你能解释一下你所说的可复制的数据样本是什么意思吗?对不起,我是个新手,非常感谢!将错误获取为'NameError:name'f'未定义'I added'将pyspark.sql.functions导入为f'到您的解决方案伟大的解决方案!非常感谢您的支持:我收到这样一条警告:“警告WindowExec:没有为窗口操作定义分区!”!将所有数据移动到单个分区,这可能会导致严重的性能下降“这是一个大问题吗?”?如何克服这个问题?这个警告只是为了提醒大家,在数据出现偏斜的情况下,分区会不均匀。因此,如果您的数据平均分布在所有分区中,那么您最好考虑这个问题以了解更多详细信息将错误设置为“NameError:name'f'未定义”“我添加了”“将pyspark.sql.functions导入为f”到您的解决方案伟大的解决方案!非常感谢您的支持:我收到这样一条警告:“警告WindowExec:没有为窗口操作定义分区!”!将所有数据移动到单个分区,这可能会导致严重的性能下降“这是一个大问题吗?”?如何克服这个问题?这个警告只是为了提醒大家,在数据出现偏斜的情况下,分区会不均匀。因此,如果您的数据平均分布在所有分区中,那么您最好考虑这个问题以了解更多详细信息