Impala last_value在视图中返回不一致的结果

时间:2017-07-10 19:50:30

标签: sql cloudera impala hue

我有一些数据以下列方式格式化,我在创建具有正确输出的Impala视图时遇到问题。 让我们称这个表为 h_test_daily

+--------+-----------+-------+
| Tag_ID | Date      | Value |
+--------+-----------+-------+
| 1      | 7/10/2017 | 10    |
| 1      | 7/10/2017 |       |
| 1      | 7/9/2017  | 8     |
| 2      | 7/10/2017 | 20    |
| 2      | 7/10/2017 | 16    |
| 2      | 7/9/2017  | 9     |
| 3      | 7/10/2017 |       |
| 3      | 7/10/2017 | 10    |
| 3      | 7/9/2017  | 5     |
| 4      | 7/10/2017 | 13    |
| 4      | 7/10/2017 |       |
| 4      | 7/9/2017  | 18    |
+--------+-----------+-------+

我正在尝试使用Impala(在HUE服务器上)对其执行last_value()聚合。现在执行以下SQL工作正常:

SELECT DISTINCT Tag_ID, `Date`, Value FROM
(SELECT Tag_ID, 
`Date`,
last_value(Value IGNORE NULLS) over (PARTITION BY Tag_ID, `Date` 
ORDER BY `Date` ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as Value
FROM test.h_test_daily)
TAB
;

这个输出是正确的。对于每个日期,我得到每个标记的最后一个值。

+--------+-----------+----------+
| Tag_ID |     Date  |    Value |
+--------+-----------+----------+
|      3 | 7/10/2017 |       10 |
|      4 | 7/10/2017 |       13 |
|      1 | 7/10/2017 |       10 |
|      1 | 7/9/2017  |        8 |
|      4 | 7/9/2017  |       18 |
|      2 | 7/9/2017  |        9 |
|      3 | 7/9/2017  |        5 |
|      2 | 7/10/2017 |       16 |
+--------+-----------+----------+

因此,当我尝试使用该SQL创建一个View时,它会做一些奇怪的事情。我开始看到空值。它获取最后一个值,现在看它是否为null。这个问题不会发生在桌子上。我希望我做错了,创建视图只显示它。

以下是视图的输出:

+--------+-----------+----------+
| Tag_ID |     Date  |    Value |
+--------+-----------+----------+
|      3 | 7/10/2017 | 10       |
|      1 | 7/9/2017  | 8        |
|      4 | 7/9/2017  | 18       |
|      4 | 7/10/2017 | NULL     |
|      1 | 7/10/2017 | NULL     |
|      2 | 7/9/2017  | 9        |
|      3 | 7/9/2017  | 5        |
|      2 | 7/10/2017 | 16       |
+--------+-----------+----------+

修改 我做了一大堆修改,我仍然遇到同样的问题。这是我尝试过的:

添加了名为mins的列

戈登指出,我的订单错了。每个分区都具有相同的order-by键。该表是来自几个传感器的数据,它每小时更新一整小时的数据。所以我为每一行添加了 mins 列。 (当与 Tag_ID 结合使用时)这是唯一的

这是更新的表和SQL

+--------+-----------+-------+------+
| Tag_ID |   Date    | Value | mins |
+--------+-----------+-------+------+
|      1 | 7/9/2017  |     8 |   10 |
|      1 | 7/10/2017 |    10 |   10 |
|      1 | 7/10/2017 |    13 |   11 |
|      1 | 7/10/2017 |       |   12 |
|      2 | 7/9/2017  |     9 |   10 |
|      2 | 7/10/2017 |    15 |   10 |
|      2 | 7/10/2017 |    16 |   11 |
|      3 | 7/9/2017  |     5 |   10 |
|      3 | 7/10/2017 |       |   10 |
|      3 | 7/10/2017 |    10 |   11 |
|      4 | 7/9/2017  |    18 |   10 |
|      4 | 7/10/2017 |    13 |   10 |
|      4 | 7/10/2017 |       |   11 |
+--------+-----------+-------+------+

现在,对于select语句和create视图,我遇到了同样的问题。这是更新的SQL语句:

SELECT DISTINCT Tag_ID, `Date`, Value FROM
(SELECT Tag_ID, 
`Date`,
last_value(Value ignore nulls) over (PARTITION BY Tag_ID, `Date` ORDER BY 
mins ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as Value
FROM test.h_test_daily)
TAB
;

然后我尝试过滤掉子选择中的null值,因此我添加了WHERE Value IS NOT NULL。问题是,在实际数据集中,大约有40个不同的 Value 列提供不同的信息。因此,即使其他值之一 null,该列也会从查询中删除。

最终编辑:我联系了Cloudera的支持团队,澄清了这个问题。他们已经回来说这是一个 Impala 问题。因为他们没有考虑创建视图上的ignore nulls参数。此问题计划在2.10.0中修复。这是Bug线程:Link

1 个答案:

答案 0 :(得分:1)

这既不是视图也不是表格的问题。问题出在你的查询上。您有order by date,但您也按日期进行分区。因此,分区的日期是不变的。

SQL中的排序不稳定。这意味着当密钥相同时,它们可以按任何顺序出现 - 而且它们可以。为什么?原因很简单:SQL表代表无序集。没有默认的排序顺序。

事实是,查询在任一上下文中都不起作用。它碰巧看起来像是在一种情况下工作,而不是另一种情况。您需要另一个键才能使排序稳定,因此将始终选择相同的先前值。