Ваш запрос должен работать. Я только что попробовал это на оболочке pyspark.
>>> from datetime import datetime
>>> import pyspark.sql.functions as F
>>> columns = ['id', 'ts']
>>> vals = [
... (1, datetime(2018, 6, 26)),
... (2, datetime(2018, 6, 27)),
... (3, datetime(2018, 6, 28)),
... (4, datetime(2018, 6, 29)),
... (5, datetime(2018, 6, 30))
... ]
>>> df = spark.createDataFrame(vals, columns)
>>> df.show()
+---+-------------------+
| id| ts|
+---+-------------------+
| 1|2018-06-26 00:00:00|
| 2|2018-06-27 00:00:00|
| 3|2018-06-28 00:00:00|
| 4|2018-06-29 00:00:00|
| 5|2018-06-30 00:00:00|
+---+-------------------+
>>> df.printSchema()
root
|-- id: long (nullable = true)
|-- ts: timestamp (nullable = true)
Вот запрос, похожий на ваш:
>>> df.filter(df['ts'] >= F.lit('2018-06-27 00:00:00')) \
... .filter(df['ts'] < F.lit('2018-06-29 00:00:00')).show()
+---+-------------------+
| id| ts|
+---+-------------------+
| 2|2018-06-27 00:00:00|
| 3|2018-06-28 00:00:00|
+---+-------------------+
Вы также можете использовать логический оператор, чтобы сделать два фильтра одновременно:
>>> df.filter((df['ts'] >= F.lit('2018-06-27 00:00:00'))
... & (df['ts'] < F.lit('2018-06-29 00:00:00'))).show()
+---+-------------------+
| id| ts|
+---+-------------------+
| 2|2018-06-27 00:00:00|
| 3|2018-06-28 00:00:00|
+---+-------------------+
Наконец, вам не нужна функция lit
. Так что вы можете просто использовать строку:
>>> df.filter((df['ts'] >= '2018-06-27 00:00:00')
... & (df['ts'] < '2018-06-29 00:00:00')).show()
+---+-------------------+
| id| ts|
+---+-------------------+
| 2|2018-06-27 00:00:00|
| 3|2018-06-28 00:00:00|
+---+-------------------+
Для часового пояса вы можете увидеть документацию pyspark для из функции __unixtime .
Я также вставил приведенный ниже пример для удобства:
>>> spark.conf.set("spark.sql.session.timeZone", "America/Los_Angeles")
>>> time_df = spark.createDataFrame([(1428476400,)], ['unix_time'])
>>> time_df.select(from_unixtime('unix_time').alias('ts')).collect()
[Row(ts='2015-04-08 00:00:00')]
>>> spark.conf.unset("spark.sql.session.timeZone")