在pyspark中将Stringtype的日期转换为Int

时间:2017-08-29 21:49:32

标签: dataframe pyspark rdd

我有一个如下所示的数据集: item_nbr |日期 123 | 2016年9月23日 123 | 2016年10月23日 112 | 2016年8月15日 112 | 2016年9月15日

我使用groupByKey使它看起来像这样: #&39; 123' [' 2016年9月23日'' 2016年10月23日'] #&39; 112' [' 2016年8月15日'' 2016年9月15日'] 现在我想计算这两个日期之间的差异。我有一个看起来像这样的函数:

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日期? 感谢。

1 个答案:

答案 0 :(得分: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|
    +--------+----------+---------+