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