使用pyspark中的截止值的日期差异(以天为单位)

dffbzjpn  于 2022-12-13  发布在  Apache
关注(0)|答案(1)|浏览(94)

我正在学习Spark,我正在尝试创建一个列,显示日期和截止值之间的天数差。
这里有一些数据沿着我用Pandas的解决方案。

lst = ['2018-11-21',
        '2018-11-01',
        '2018-10-09',
        '2018-11-23',
        '2018-11-08',
        '2018-10-06',
        '2018-11-27',
        '2018-10-07',
        '2018-10-23',
        '2018-11-02']

d = pd.DataFrame({'event':np.arange(len(lst)),'ts':lst})
d['ts'] = d['ts'].apply(pd.to_datetime) # only needed because I have alist of strings

d['new_ts'] = d.ts - (d.ts.max() - pd.to_timedelta(15, unit='d'))

不幸的是,我找不到一种方法来使这种逻辑适应pyspark。我认为问题在于减去了不是DataFrame一部分的静态日期。
假设df是上述数据集“d”的“Spark版本”,下面是我尝试的一件事:

calculator = udf(lambda x: datediff(datediff(date_sub(max(x),30),x)))
c = df.withColumn('Recency',calculator(col('ts')))

然而,他在下面给予了我一个很长的错误c.select(col('Recency')).show(1)c.show(1)
提前感谢每一个愿意帮忙的人。

y53ybaqx

y53ybaqx1#

其逻辑是:

  • 计算最大日期。
  • 减去给定的天数以获得截止日期。
  • 查找与截止日期相差天数
df = spark.createDataFrame(data=[["2018-11-21"],["2018-11-01"],["2018-10-09"],["2018-11-23"],["2018-11-08"],["2018-10-06"],["2018-11-27"],["2018-10-07"],["2018-10-23"],["2018-11-02"]], schema=["ts"])

df = df.withColumn("ts", F.to_date("ts", "yyyy-MM-dd"))

cutoff_dt = df.select(F.date_sub(F.max("ts"), 15).alias("cutoff_dt")).first().asDict()["cutoff_dt"]

df = df.withColumn("new_ts", F.datediff("ts", F.lit(cutoff_dt)))

df.show(truncate=False)

+----------+------+
|ts        |new_ts|
+----------+------+
|2018-11-21|9     |
|2018-11-01|-11   |
|2018-10-09|-34   |
|2018-11-23|11    |
|2018-11-08|-4    |
|2018-10-06|-37   |
|2018-11-27|15    |
|2018-10-07|-36   |
|2018-10-23|-20   |
|2018-11-02|-10   |
+----------+------+

相关问题