我正在尝试获得以下内容:
+--------------------+
|work_time | day_shift|
+--------------------+
| 00:45:40 | No |
| 10:05:47 | Yes |
| 15:25:28 | Yes |
| 19:38:52 | No |
其中我将";工作时间";变成";day_shift">
"是"-如果时间落在09:00:00和18:00:00之间;否"-否则
我的"工作时间";是日期时间格式,仅显示时间。我尝试了以下方法,但我只是得到了";否";为所有事情。
df = df.withColumn('day_shift', when(df.work_time >= to_timestamp(lit('09:00:00'), 'HH:mm:ss') & df.work_time <= to_timestamp(lit('18:00:00'), 'Yes').otherwise('No'))
您可以使用Column
类方法between
。它同时适用于格式为"HH:mm:ss"
的时间戳和字符串。使用此:
F.col("work_time").between("09:00:00", "18:00:00")
完整测试:
from pyspark.sql import functions as F
df = spark.createDataFrame([('00:45:40',), ('10:05:47',), ('15:25:28',), ('19:38:52',)], ['work_time'])
day_shift = F.col("work_time").between("09:00:00", "18:00:00")
df = df.withColumn("day_shift", F.when(day_shift, "Yes").otherwise("No"))
df.show()
# +---------+---------+
# |work_time|day_shift|
# +---------+---------+
# | 00:45:40| No|
# | 10:05:47| Yes|
# | 15:25:28| Yes|
# | 19:38:52| No|
# +---------+---------+
首先,spark没有所谓的"时间";数据类型,它只支持TimestampType
或DateType
。因此,我相信数据帧中的work_time
是一个字符串。
其次,当您在选择语句中检查func.to_timestamp(func.lit('09:00:00'), 'HH:mm:ss')
时,它将显示:
+--------------------------------+
|to_timestamp(09:00:00, HH:mm:ss)|
+--------------------------------+
|1970-01-01 09:00:00 |
+--------------------------------+
only showing top 1 row
最好的方法是将work_time
列分别拆分为hour
、minute
和second
列并进行筛选,或者在任何时间戳筛选之前在work_time
列中添加日期值。