【问题标题】:Converting date that is a Stringtype into Int in pyspark在pyspark中将Stringtype的日期转换为Int
【发布时间】:2018-02-07 11:37:16
【问题描述】:

我有一个如下所示的数据集: item_nbr |日期 123 | 2016-09-23 123 | 2016-10-23 112 | 2016-08-15 112 | 2016-09-15

我使用 groupByKey 使它看起来像这样: '123',['2016-09-23','2016-10-23'] '112',['2016-08-15','2016-09-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 日期? 谢谢。

【问题讨论】:

  • 您尝试过使用日期时间库吗?如datetime.strptime(x[1][j], '%Y-%m-%d')
  • 另外,您是否有理由不将这些转换为日期时间对象之前按键分组?我也不知道您的更大目标,所以这可能合适也可能不合适,但窗口函数或聚合函数在这里可能更容易。调查他们。
  • 现在在函数中使用了日期时间库。工作得很好,谢谢。 :) 我尝试将字符串转换为日期时间对象,但这不是最终输出的要求,因此在按键分组之前没有这样做。

标签: dataframe pyspark rdd


【解决方案1】:

你应该使用窗口函数而不是使用 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|
    +--------+----------+---------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多