Сравнение фильтра отметок времени Spark SQL не работает должным образом - PullRequest
0 голосов
/ 07 июня 2018

Я не смог бы раскрыть точное имя таблиц из-за соответствия требованиям клиентов.

Мы используем Spark 1.6.0.У меня есть таблица «test» со столбцом timestamp «cal_cymd» и другой столбец, связанный с количеством, то есть «qty».Когда я выполняю запрос с оператором "=" в предложении where, он возвращает строку, как показано ниже:

hc.sql("SELECT SUM(A.qty) as qty, A.cal_cymd FROM test A WHERE A.cal_cymd = '2013-04-01 00:00:00.000000' group by A.cal_cymd ORDER BY A.cal_cymd ASC").show

Результаты:

+-----------------------+-------------------+
|qty                    |           cal_cymd|
+-----------------------+-------------------+
|                6245564|2013-04-01 00:00:00|
+-----------------------+-------------------+

Объяснить план:

|== Physical Plan ==
*Sort [cal_cymd#662 ASC NULLS FIRST], true, 0
+- Exchange rangepartitioning(cal_cymd#662 ASC NULLS FIRST, 200)
   +- *HashAggregate(keys=[cal_cymd#662], functions=[sum(cast(qty#633 as bigint))])
      +- Exchange hashpartitioning(cal_cymd#662, 200)
         +- *HashAggregate(keys=[cal_cymd#662], functions=[partial_sum(cast(qty#633 as bigint))])
            +- *FileScan parquet test[qty#633,cal_cymd#662] Batched: true, Format: Parquet, Location: PrunedInMemoryFileIndex[hdfs://<namenode>/tmp/test, PartitionCount: 1, PartitionFilters: [isnotnull(cal_cymd#662), (cal_cymd#662 = 1364799600000000)], PushedFilters: [], ReadSchema: struct<qty:int>|

Но когда я выполняю оператор "> =", он игнорирует "=" и пропускает нижнюю границу, как показано ниже:

hc.sql("SELECT SUM(A.qty) as qty, A.cal_cymd FROM test A WHERE A.cal_cymd >= '2013-04-01 00:00:00.000000' AND A.cal_cymd <= '2013-04-10 00:00:00.000000' group by A.cal_cymd ORDER BY A.cal_cymd ASC").show

Результаты:

+-----------------------+-------------------+
|qty                    |           cal_cymd|
+-----------------------+-------------------+
|                6522988|2013-04-02 00:00:00|
|                5657898|2013-04-03 00:00:00|
|                5893992|2013-04-04 00:00:00|
|                5678169|2013-04-05 00:00:00|
|                7162790|2013-04-08 00:00:00|
|                6814059|2013-04-09 00:00:00|
|                6112823|2013-04-10 00:00:00|
+-----------------------+-------------------+

Объяснить план:

|== Physical Plan ==
*Sort [cal_cymd#565 ASC NULLS FIRST], true, 0
+- Exchange rangepartitioning(cal_cymd#565 ASC NULLS FIRST, 200)
   +- *HashAggregate(keys=[cal_cymd#565], functions=[sum(cast(qty#536 as bigint))])
      +- Exchange hashpartitioning(cal_cymd#565, 200)
         +- *HashAggregate(keys=[cal_cymd#565], functions=[partial_sum(cast(qty#536 as bigint))])
            +- *FileScan parquet test[qty#536,cal_cymd#565] Batched: true, Format: Parquet, Location: PrunedInMemoryFileIndex[hdfs://<namenode>/tmp/test, PartitionCount: 7, PartitionFilters: [isnotnull(cal_cymd#565), (cast(cal_cymd#565 as string) >= 2013-04-01 00:00:00.000000), (cast(cal..., PushedFilters: [], ReadSchema: struct<qty:int>|

Выше результата пропущено значение отметки времени «2013-04-01 00: 00: 00.000000», но у нас есть данные, соответствующие ему.

Пожалуйста, помогите мне понять, почему сравнение меток времени с ">" не работает нормально.

Добавление информации, чтобы сделать ее воспроизводимой:

У меня естьтаблица в формате паркета улья с оператором create, как показано ниже:

create external table test ( cal_cymd timestamp, qty int) stored as parquet location '/tmp/test' tblproperties ('parquet.compress=SNAPPY')

Пример данных в таблице:

+-----------------------+-------------------+
|qty                    |           cal_cymd|
+-----------------------+-------------------+
|                      3|2013-04-01 00:00:00|
|                      3|2013-04-02 00:00:00|
|                      3|2013-04-03 00:00:00|
|                      2|2013-04-04 00:00:00|
|                      3|2013-04-05 00:00:00|
|                      7|2013-04-06 00:00:00|
|                      8|2013-04-07 00:00:00|
|                      1|2013-04-08 00:00:00|
|                      1|2013-04-09 00:00:00|
|                      5|2013-04-10 00:00:00|
+-----------------------+-------------------+
...