根据两列之间的时间差过滤pyspark数据帧

时间:2017-08-23 21:09:29

标签: python pyspark pyspark-sql

我有一个包含多列的数据框,其中两列的类型为pyspark.sql.TimestampType。我想将此数据帧过滤到这两列之间的时差小于一小时的行。

我目前正在尝试这样做: examples = data.filter((data.tstamp - data.date) < datetime.timedelta(hours=1))

但是这失败并显示以下错误消息:

org.apache.spark.sql.AnalysisException: cannot resolve '(`tstamp` - `date`)' due to data type mismatch: '(`tstamp` - `date`)' requires (numeric or calendarinterval) type, not timestamp

实现此过滤器的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您的列具有不同的类型,很难解释差异的含义,通常是时间戳的秒数和日期的天数。您可以预先将两列转换为unix时间戳,以获得秒的差异:

import pyspark.sql.functions as psf
data.filter(
    psf.abs(psf.unix_timestamp(data.tstamp) - psf.unix_timestamp(data.date)) < 3600
)

修改

此函数将对字符串(假设格式正确),时间戳和日期起作用:

import datetime
data = hc.createDataFrame(sc.parallelize([[datetime.datetime(2017,1,2,1,1,1), datetime.date(2017,8,7)]]), ['tstamp', 'date'])
data.printSchema()
    root
     |-- tstamp: timestamp (nullable = true)
     |-- date: date (nullable = true)

data.select(
    psf.unix_timestamp(data.tstamp).alias('tstamp'), psf.unix_timestamp(data.date).alias("date")
).show()
    +----------+----------+
    |    tstamp|      date|
    +----------+----------+
    |1483315261|1502056800|
    +----------+----------+