2016-04-19 31 views
6
I pySpark kullanıyorum

farklılıkları hesaplamak için bir pencere fonksiyonu uygulamak ve aşağıdaki gibi iki sütun günlük varlık fiyatı temsil eden benim dataframe kurdunuz:pySpark

ind = sc.parallelize(range(1,5)) 
prices = sc.parallelize([33.3,31.1,51.2,21.3]) 
data = ind.zip(prices) 
df = sqlCtx.createDataFrame(data,["day","price"]) 

Ben df.show() uygulayarak üzerine olsun:

+---+-----+ 
|day|price| 
+---+-----+ 
| 1| 33.3| 
| 2| 31.1| 
| 3| 51.2| 
| 4| 21.3| 
+---+-----+ 

Her şey yolunda. Ben çok araştırmadan sonra

(price(day2)-price(day1))/(price(day1))

gibi başka bir deyişle fiyat sütununun, gün be gün döner içeren sütunu, bir şey istiyorum, ben bu en verimli uygulanması aracılığıyla gerçekleştirilir söyledi am pyspark.sql.window işlevleri, ancak nasıl göremiyorum.

cevap

13

Bir önceki günün sütununu lag işlevini kullanarak getirebilir ve iki sütundan günlük olarak dönüş yapan ek sütun ekleyebilirsiniz, ancak kıvılcım verilerinizi ve/veya siparişinizi nasıl bölümlendireceğinizi anlamanız gerekebilir. böyle lag, bir şey yapmak için:

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

dfu = df.withColumn('user', lit('tmoore')) 

df_lag = dfu.withColumn('prev_day_price', 
         func.lag(dfu['price']) 
           .over(Window.partitionBy("user"))) 

result = df_lag.withColumn('daily_return', 
      (df_lag['price'] - df_lag['prev_day_price'])/df_lag['price']) 

>>> result.show() 
+---+-----+-------+--------------+--------------------+ 
|day|price| user|prev_day_price|  daily_return| 
+---+-----+-------+--------------+--------------------+ 
| 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| 
+---+-----+-------+--------------+--------------------+ 

İşte Window functions in Spark içine uzun giriştir.

+1

Merhaba. Teşekkürler! Bu çok kullanışlı. Bu arada, "yanan" işlevi ne yapar? –

+1

'lit' - Bir tamsayı değeri yaratır - https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.lit – Oleksiy

+0

Merhaba Oleksiy, tamam, teşekkürler ! –