在Hiveql中的窗口

时间:2020-02-23 14:33:39  来源:igfitidea点击:

在SQL:2003标准中介绍的窗口概念允许SQL程序员从汇总和其他窗口函数可以运行的数据中创建帧。
Hiveql现在支持每个SQL标准的窗口。
在解释窗口和聚合函数时,示例非常有用。

在飞行时,出发延误随着我们所选择的旅行方式而出发。
然后,它没有令人惊讶的是,RITA编译的飞行数据包括此信息。
"每天平均航班延迟究竟是什么"?
以下列表中的查询产生了2008年每天的平均出发延迟。

(A) hive (flightdata)> CREATE VIEW avgdepdelay AS
           > SELECT DayOfWeek, AVG(DepDelay) 
           FROM FlightInfo2008 GROUP BY DayOfWeek;
OK
Time taken: 0.121 seconds
(B) hive (flightdata)> SELECT * FROM avgdepdelay;
...
OK
1       10.269990244459473
2       8.97689712068735
3       8.289761053658728
4       9.772897177836702
5       12.158036387869656
6       8.645680904903614
7       11.568973392595312
Time taken: 18.6 seconds, Fetched: 7 row(s)

TGIF,或者"感谢上帝星期五,"不适用于每个人。
星期五 - 第5天在步骤(b)的结果下 - 延迟次数最多。

无论如何,关于步骤(a)中的查询:Hive的数据定义语言(DDL)还包括Create View语句,这可能非常有用。
在Hive中,视图允许保存查询,但数据不会与CREATE表一起存储为SELECT(CTA)语句。

在HiveQL中引用视图时,Hive执行查询,然后使用结果,该结果可能是较大查询的一部分。
这对于简化复杂查询并将其分解为逻辑组件,这非常有用。
此外,请注意群组按子句,每周收集所有日间,并允许AVG聚合函数每天提供合并答案。

当然,这个信息很有用,但如果你想每天看到一些单独的数字是什么?
通过组巩固数据,我们可以获得我们正在寻找的答案,尽管我们也丢失了信息。
解决信息丢失问题是窗口变得非常方便的问题。

这是关于丽塔2008飞行数据的另一个问题,即apache Hive可以回答:"机场X和Y之间的第一个飞行是什么?
假设除了这些信息,你还想了解随后的航班,以防你不是一个"早上的人"。
好吧,这是在Hiveql窗口的工作!以下列表为我们提供了一个解答这些问题的查询。

(A) hive (flightdata)> SELECT f08.Month, f08.DayOfMonth,
    cr.description, f08.Origin, f08.Dest, f08.FlightNum,
    f08.DepTime, MIN(f08.DepTime)
OVER (PARTITION BY f08.DayOfMonth ORDER BY f08.DepTime)
FROM flightinfo2008 f08 JOIN Carriers cr ON 
    f08.UniqueCarrier = cr.code
WHERE f08.Origin = 'JFK' AND f08.Dest = 'ORD' AND 
    f08.Month = 1 AND f08.DepTime != 0;
...
OK
1     1  JetBlue Airways         JFK ORD 903   641 641
1     1  American Airlines Inc.  JFK ORD 1323  833  641
1     1  JetBlue Airways         JFK ORD 907   929  641
1     1  Comair Inc.             JFK ORD 5083  945  641
1     1  Comair Inc.             JFK ORD 5634  1215 641
1     1  JetBlue Airways         JFK ORD 915   1352 641
1     1  American Airlines Inc.  JFK ORD 1323  833  641
1     1  JetBlue Airways         JFK ORD 907   929  641
1     1  Comair Inc.             JFK ORD 5083  945  641
1     1  Comair Inc.             JFK ORD 5634  1215 641
1     1  JetBlue Airways         JFK ORD 915   1352 641
1     1  American Airlines Inc.  JFK ORD 1815  1610 641
1     1  JetBlue Airways         JFK ORD 917   1735 641
1     1  Comair Inc.             JFK ORD 5469  1749 641
1     1  Comair Inc.             JFK ORD 5492  2000 641
1     1  JetBlue Airways         JFK ORD 919   2102 641
1     31 JetBlue Airways         JFK ORD 919   48   48
1     31 JetBlue Airways         JFK ORD 903   635  48
1     31 Comair Inc.             JFK ORD 5447  650  48
1     31 American Airlines Inc.  JFK ORD 1323  840  48
1     31 JetBlue Airways         JFK ORD 907   921  48
1     31 JetBlue Airways         JFK ORD 917   1859 48

在步骤(a)中,逐个子句被替换为over子句,我们可以其中指定要在其上运行的分区或者窗口。
还包括订单按条款,以便我们可以在第一个之后看到随后的航班。

从上市中可以看出,在1月31日,JetBlue有一个很好的,早期航班在12:48 -opt为后来,在6:35上午的早期提升者发出问题,请注意你已经保留了信息如果我们选择再次使用Group By子句,则丢失的查询输出。

单独的这种函数使窗口成为一个强大的函数,并且还有更多。
除了Hive0.11版本中的窗口,社区提供了一些可以与窗口一起使用的分析函数。
我们也可以使用这些函数:等级,row_number,dense_rank,cume_dist,percile_rank和ntile。

最后,不要错过联接的使用:这是一个现实生活,实际的一个内部连接的实际例子,你将使用运营商表加入FlightInfo2008表来获取航空名称 - 而不是在FlightInfo2008表中找到的隐秘代码。