【问题标题】:how to compute diff for one col in spark dataframe?如何计算火花数据框中一个列的差异?
【发布时间】:2016-07-01 03:03:00
【问题描述】:
+-------------------+
|           Dev_time|
+-------------------+
|2015-09-18 05:00:20|
|2015-09-18 05:00:21|
|2015-09-18 05:00:22|
|2015-09-18 05:00:23|
|2015-09-18 05:00:24|
|2015-09-18 05:00:25|
|2015-09-18 05:00:26|
|2015-09-18 05:00:27|
|2015-09-18 05:00:37|
|2015-09-18 05:00:37|
|2015-09-18 05:00:37|
|2015-09-18 05:00:38|
|2015-09-18 05:00:39|
+-------------------+

对于 spark 的数据框,我想计算日期时间的差异,就像在 numpy.diff(array) 中一样

【问题讨论】:

  • 欢迎来到 SO!请分享MCVE,以便我们尝试提供帮助。这是一个质量非常低的问题

标签: datetime apache-spark apache-spark-sql spark-dataframe


【解决方案1】:

一般来说,使用 Spark DataFrames 没有有效的方法来实现这一点。更不用说像订单这样的事情在分布式设置中变得非常棘手。理论上你可以使用lag函数如下:

from pyspark.sql.functions import lag, col, unix_timestamp
from pyspark.sql.window import Window

dev_time = (unix_timestamp(col("dev_time")) * 1000).cast("timestamp")

df = sc.parallelize([
    ("2015-09-18 05:00:20", ), ("2015-09-18 05:00:21", ),
    ("2015-09-18 05:00:22", ), ("2015-09-18 05:00:23", ),
    ("2015-09-18 05:00:24", ), ("2015-09-18 05:00:25", ),
    ("2015-09-18 05:00:26", ), ("2015-09-18 05:00:27", ),
    ("2015-09-18 05:00:37", ), ("2015-09-18 05:00:37", ),
    ("2015-09-18 05:00:37", ), ("2015-09-18 05:00:38", ),
    ("2015-09-18 05:00:39", )
]).toDF(["dev_time"]).withColumn("dev_time", dev_time)

w = Window.orderBy("dev_time")
lag_dev_time = lag("dev_time").over(w).cast("integer")

diff = df.select((col("dev_time").cast("integer") - lag_dev_time).alias("diff"))

## diff.show()
## +----+
## |diff|
## +----+
## |null|
## |   1|
## |   1|
## |   1|
## |   1|
## |   1|
## |   1|
## |   1|
## |  10|
## ...

但是效率极低(对于窗口函数,如果没有提供PARTITION BY 子句,则将所有数据移动到单个分区)。在实践中,在 RDD (Scala) 上使用 sliding 方法或实现您自己的滑动窗口 (Python) 更有意义。见:

【讨论】:

  • 如果使用 approxCountDistinct 函数怎么样?
  • @giaosudau 它有什么帮助?
  • 是的。因为它实现了 hyperloglog 算法?正如我认为的那样,在计算不同时效率更高。我不确定只是问。
  • @giaosudau 我的意思是计算不同元素如何帮助计算时间序列上的差异?
  • 对不起,我只是觉得他想计算不同的日期时间。所以我认为只是使用 DataFrame 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2017-02-15
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多