应用窗口函数计算pySpark中的差异

应用窗口函数计算pySpark中的差异,pyspark,spark-dataframe,window-functions,pyspark-sql,Pyspark,Spark Dataframe,Window Functions,Pyspark Sql,我使用的是pySpark,我的数据框中有两列表示每日资产价格,如下所示: ind=sc.parallelize(范围(1,5)) 价格=sc.并行化([33.3,31.1,51.2,21.3]) 数据=ind.zip(价格) df=sqlCtx.createDataFrame(数据,[“天”,“价格]) 我开始应用df.show(): +---+-----+ |日价格| +---+-----+ | 1| 33.3| | 2| 31.1| | 3| 51.2| | 4| 21.3| +-

我使用的是
pySpark
,我的数据框中有两列表示每日资产价格,如下所示:

ind=sc.parallelize(范围(1,5))
价格=sc.并行化([33.3,31.1,51.2,21.3])
数据=ind.zip(价格)
df=sqlCtx.createDataFrame(数据,[“天”,“价格])
我开始应用
df.show()

+---+-----+
|日价格|
+---+-----+
|  1| 33.3|
|  2| 31.1|
|  3| 51.2|
|  4| 21.3|
+---+-----+
这很好。我想要另一个列,包含价格列的日常回报,例如

(价格(第2天)-价格(第1天))/(价格(第1天))


经过大量研究,我被告知这是通过应用
pyspark.sql.window
函数最有效地实现的,但我不知道如何使用该函数创建“前一天”列,并添加从这两个列实际每天返回的额外列,但是,您可能需要告诉spark如何对数据进行分区和/或命令它执行滞后操作,类似这样的操作:

从pyspark.sql.window导入窗口
将pyspark.sql.functions作为func导入
从pyspark.sql.functions导入
dfu=df.withColumn('user',lit('tmoore'))
df_lag=dfu.带列(‘上一天价格’,
函数滞后(dfu[“价格])
.over(Window.partitionBy(“用户”))
结果=df_lag.with column('daily_return',
(df_lag['price']-df_lag['prev_day_price'])/df_lag['price'])
>>>result.show()
+---+-----+-------+--------------+--------------------+
|日|价格|用户|上一日|价格|日回报|
+---+-----+-------+--------------+--------------------+
|1 | 33.3 | tmoore | null | null|
|2 | 31.1 | tmoore | 33.3 |-0.07073954983922816|
|3 | 51.2 | tmoore | 31.1 | 0.392578125|
|4 | 21.3 | tmoore | 51.2 |-1.403755868544601|
+---+-----+-------+--------------+--------------------+

下面是对的详细介绍。

滞后功能可以帮助您解决您的用例

from pyspark.sql.window import Window
import pyspark.sql.functions as func

### Defining the window 
Windowspec=Window.orderBy("day")

### Calculating lag of price at each day level
prev_day_price= df.withColumn('prev_day_price',
                        func.lag(dfu['price'])
                                .over(Windowspec))

### Calculating the average                                  
result = prev_day_price.withColumn('daily_return', 
          (prev_day_price['price'] - prev_day_price['prev_day_price']) / 
prev_day_price['price'] )

你好谢谢这是非常有用的。顺便问一下,“lit”函数做什么?
lit
-创建一列文字值-次要注释。对延迟应用的列进行排序也是一种很好的做法,例如Window.partitionBy(“用户”).orderBy(“day”,升序=True)评估dfu延迟时,我得到一个错误:Window函数lag(price#66,1,null)要求订购窗口,dfu.withColumn('prev#u day#price',func.lag(dfu['price'])。over(Window.orderBy(“用户”))解决了这一问题—如何使用spark结构化流媒体实现这一点?我假设sqlCtx相当于使用sc=SparkContext(“本地”)spark=SparkSession(sc)获得的“spark”对象