impala last\u值在视图中返回不一致的结果

xwbd5t1u  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(408)

我有一些数据格式如下,我有问题创建一个正确的输出 Impala 视图。让我们每天将此表称为h_test_:

+--------+-----------+-------+
| 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服务器上)对其执行最后一次\u 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创建一个视图时,它会做一些奇怪的事情。我开始看到空值。它在哪里获取最后一个值,现在查看它是否为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的列
戈登指出,我点的菜不对。每个分区的键顺序相同。该表是来自几个传感器的数据,每小时都会更新一整小时的数据。所以我为每行添加了一个mins列(与标记(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个不同的值列提供不同的信息。因此,即使其他值之一不存在,该列也将从查询中删除 null .
最终编辑:我联系了cloudera的支持团队来澄清这个问题。他们回来说这是 Impala 的问题。因为他们没有考虑 ignore nulls 参数。计划在2.10.0中修复此问题。下面是bug线程:link

hfwmuf9z

hfwmuf9z1#

这对于视图和表都不是问题。问题出在你的查询上。你有 order by date ,但您也按日期进行分区。所以,分区的日期是常数。
排序在sql中是不稳定的。这意味着,当键相同时,它们可以以任何顺序出现——它们确实如此。为什么?原因很简单:sql表表示无序集。没有默认的排序顺序。
事实上,查询在这两种上下文中都不起作用。它只是碰巧在一种情况下看起来起作用,但在另一种情况下却不起作用。您需要另一个键来稳定排序,因此始终会选择相同的前一个值。

相关问题