在Hiveql中的窗口
在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表中找到的隐秘代码。