我有一些数据以下列方式格式化,我在创建具有正确输出的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
答案 0 :(得分:1)
这既不是视图也不是表格的问题。问题出在你的查询上。您有order by date
,但您也按日期进行分区。因此,分区的日期是不变的。
SQL中的排序不稳定。这意味着当密钥相同时,它们可以按任何顺序出现 - 而且它们可以。为什么?原因很简单:SQL表代表无序集。没有默认的排序顺序。
事实是,查询在任一上下文中都不起作用。它碰巧看起来像是在一种情况下工作,而不是另一种情况。您需要另一个键才能使排序稳定,因此将始终选择相同的先前值。