2017-08-29 8 views
1

私はこのようなデータセットを持っています: item_nbr |日付 123 | 2016-09-23 123 | 2016-10-23 112 | 2016-08-15 112 | 2016年9月15日私はそれはこのように見えるようにgroupByKeyを使用pysparkでString型の日付をIntに変換する

: '123'、[ '2016年9月23日'、 '2016年10月23日'] '112'、[ '2016- 08-15 '、' 2016-09-15 '] ここでは、この2つの日付の差を計算したいと考えています。それは文字列だかのように日付を扱う

def ipi_generate(x): 
    member_ipi_list = [] 
    master_ans = [] 
    for j in range(1,len(x[1])): 
     ans = x[1][j]-x[1][j-1] 
     master_ans.append(ans) 
    member_ipi_list.append(x[0]) 
    member_ipi_list.append(master_ans) 
    return [member_ipi_list] 

:私はこのようになります機能を持っています。どのように私は文字列の日付をpysparkのintの日付に変換するのですか?おかげさまで

+0

datetimeライブラリを使用してみましたか? 'datetime.strptime(x [1] [j]、 '%Y-%m-%d')'のように – aku

+0

また、キーでグループ化する前にこれらをdatetimeオブジェクト*に変換しない理由はありますか?私はあなたのより大きな目標を意識していないので、これは適切かもしれないし、そうでないかもしれませんが、ここではウィンドウ関数や集約関数が簡単かもしれません。それらを見てください。 – aku

+0

関数でdatetimeライブラリを使用しました。ありがとうございました。 :)文字列をdatetimeオブジェクトに変換しようとしましたが、最終出力が必要なのでキーでグループ化する前にそれをしませんでした。 – iratelilkid

答えて

2

かわりに、UDFを使用してのウィンドウ関数を使用する必要があります。

最初に私たちのデータフレームを作成してみましょう:

df = spark.createDataFrame(
    sc.parallelize([["123", "2016-09-23"], ["123", "2016-10-23"], ["123", "2016-11-23"], ["123", "2017-01-01"], ["112", "2016-08-15"], ["112", "2016-09-15"]]), 
    ["item_nbr", "date"] 
) 

今度は、同じ行に私たちの現在の行の日付を持ってラグ機能を使ってみましょうし、前の行の日付:

import pyspark.sql.functions as psf 
from pyspark.sql import Window 

w = Window.partitionBy("item_nbr").orderBy("date") 
df.withColumn(
    "date_diff", 
    psf.datediff("date", psf.lag("date").over(w)) 
).show() 

    +--------+----------+---------+ 
    |item_nbr|  date|date_diff| 
    +--------+----------+---------+ 
    |  112|2016-08-15|  null| 
    |  112|2016-09-15|  31| 
    |  123|2016-09-23|  null| 
    |  123|2016-10-23|  30| 
    |  123|2016-11-23|  31| 
    |  123|2017-01-01|  39| 
    +--------+----------+---------+ 
関連する問題