Spark - Сравнение даты и временной метки - бессмысленные результаты `2018-01-01` МЕНЬШЕ, чем` 2018-01-01 00: 00: 00` - PullRequest
0 голосов
/ 02 октября 2018

Я сталкиваюсь с чем-то со 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).

Может кто-нибудь объяснить, почему происходит это сравнение?Что еще более важно, могу ли я заставить Спарк вести себя в соответствии с моими ожиданиями?Могу ли я заставить Спарк просто выбросить исключение?

1 Ответ

0 голосов
/ 02 октября 2018

Это потому, что и метка времени, и дата передаются в строку, что приводит к неожиданному результату.

Вот анализируемый логический план для вашего запроса:

 +- Project [(cast(d#46 as string) < cast(t#47 as string)) AS natural_lt#37, (cast(d#46 as string) = cast(t#47 as string)) AS natural_eq#38, (cast(d#46 as string) > cast(t#47 as string)) AS natural_gt#39, (d#46 < cast(t#47 as date)) AS cast_date_lt#40, (d#46 = cast(t#47 as date)) AS cast_date_eq#41, (d#46 > cast(t#47 as date)) AS cast_date_gt#42, (cast(d#46 as timestamp) < t#47) AS cast_timestamp_lt#43, (cast(d#46 as timestamp) = t#47) AS cast_timestamp_eq#44, (cast(d#46 as timestamp) > t#47) AS cast_timestamp_gt#45]

Jira: https://issues.apache.org/jira/browse/SPARK-23549 (Fix Version / s: 2.4.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...