我有一个包含多列的数据框,其中两列的类型为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
实现此过滤器的正确方法是什么?
答案 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|
+----------+----------+