Я сталкиваюсь с чем-то со Spark и сравниваю даты с временными метками, и я просто не понимаю, что происходит.
Вот код для воспроизведения (pyspark)
query = '''with data as (
select date('2018-01-01') as d
, timestamp('2018-01-01') as t
)
select d < t as natural_lt
, d = t as natural_eq
, d > t as natural_gt
, d < date(t) as cast_date_lt
, d = date(t) as cast_date_eq
, d > date(t) as cast_date_gt
, timestamp(d) < t as cast_timestamp_lt
, timestamp(d) = t as cast_timestamp_eq
, timestamp(d) > t as cast_timestamp_gt
from data
'''
spark.sql(query).show()
И результаты:
+----------+----------+----------+------------+------------+------------+-----------------+-----------------+-----------------+
|natural_lt|natural_eq|natural_gt|cast_date_lt|cast_date_eq|cast_date_gt|cast_timestamp_lt|cast_timestamp_eq|cast_timestamp_gt|
+----------+----------+----------+------------+------------+------------+-----------------+-----------------+-----------------+
| true| false| false| false| true| false| false| true| false|
+----------+----------+----------+------------+------------+------------+-----------------+-----------------+-----------------+
Это полностью противоречит моим ожиданиям.Мы получаем, что "2018-01-01"
МЕНЬШЕ, чем "2018-01-01 00:00:00"
- очевидно, что в эту дату ничего не было до времени 00:00:00
, поэтому я нахожу это нелогичным.
Я бы ожидал либо исключение (Сравнение даты с меткой времени неоднозначно), или для сравнения их путем приведения или с меткой времени (для сравнения 2018-01-01
как 2018-01-01 00:00:00
).
Может кто-нибудь объяснить, почему происходит это сравнение?Что еще более важно, могу ли я заставить Спарк вести себя в соответствии с моими ожиданиями?Могу ли я заставить Спарк просто выбросить исключение?