pyspark - 日期数组中的间隔数组

标签 pyspark apache-spark-sql

我有一个包含日期数组的列,我想知道提取具有日期之间的间隔(以天为单位)数组的新列的最有效方法。

<表类=“s-表”> <标题> ID 日期 <正文> X [01-01-2001, 03-01-2001, 10-01-2001, 25-01-2001] 是 ... Z ...

应该变成:

<表类=“s-表”> <标题> ID 日期 间隔 <正文> X [01-01-2001, 03-01-2001, 10-01-2001, 25-01-2001] [2, 7, 15] 是 ... Z ...

我有 UDF 解析数组并逐一减去日期,但我确信有一种最有效的方法来做到这一点。 谢谢!

最佳答案

一种方法是使用 transform功能如下图:

from pyspark.sql.functions import expr

df = spark.createDataFrame([
[["01-01-2001", "03-01-2001", "10-01-2001", "25-01-2001"]]
], ["dates"]) 

df.withColumn("dates", expr("transform(dates, x -> to_date(x,'dd-MM-yyyy'))"))\
  .withColumn("diff", expr("array_remove(transform(dates, (x, i) -> if(i > 0, datediff(dates[i] , dates[i-1]), -1)), -1)"))\
  .show(100, False)

# +------------------------------------------------+----------+
# |dates                                           |diff      |
# +------------------------------------------------+----------+
# |[01-01-2001, 03-01-2001, 10-01-2001, 25-01-2001]|[2, 7, 15]|
# +------------------------------------------------+----------+

通过第一个转换,我们将字符串项转换为日期。然后,我们迭代每个项目,计算表达式 if(i > 0, datediff(dates[i],dates[i-1]), -1)

说明

  • 当 index(i) > 0 使用 datediff 获取当前日期与前一个日期之间的差异,该差异返回天数。
  • 否则返回-1。请注意,我们始终需要删除它。我们使用 -1 而不是 null,因为从数组中删除它更容易(请阅读 this 了解更多信息)
  • 最终使用array_remove从数组中删除多余的-1

关于pyspark - 日期数组中的间隔数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73543711/

相关文章:

azure - 使用 pyspark 从 azure 文件共享读取数据

apache-spark - 与文件路径列表相比,为什么 Spark 读取目录的速度要快得多?

apache-spark - 如何迭代一个组并使用 Pyspark 创建一个数组列?

python - 如何计算给定 PySpark DataFrame 的均值和标准差?

python - Pyspark 使用 AWS Glue 将 JSON 列写入 Postgres

apache-spark - 使用 sqlContext 将 JSON 结构映射到 [String,String]

apache-spark - 如何在 Spark DataFrame 中将列除以总和

apache-spark - 如果 Spark 在 Yarn 上运行,如何获取 SparkContext?

memory - 如何避免 Spark executor 丢失以及由于内存限制而导致 yarn 容器杀死它?

scala - spark 将函数应用于并行列