Я не смог бы раскрыть точное имя таблиц из-за соответствия требованиям клиентов.
Мы используем 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|
+-----------------------+-------------------+