我写了一个查询来查找3月到4月美国最繁忙的10个机场。它产生所需的输出,但我想尝试进一步优化它。
是否有任何特定于hiveql的优化可以应用于查询?是 GROUPING SETS
适用于这里?我是新来的Hive和目前这是最短的查询,我已经想出。
SELECT airports.airport, COUNT(Flights.FlightsNum) AS Total_Flights
FROM (
SELECT Origin AS Airport, FlightsNum
FROM flights_stats
WHERE (Cancelled = 0 AND Month IN (3,4))
UNION ALL
SELECT Dest AS Airport, FlightsNum
FROM flights_stats
WHERE (Cancelled = 0 AND Month IN (3,4))
) Flights
INNER JOIN airports ON (Flights.Airport = airports.iata AND airports.country = 'USA')
GROUP BY airports.airport
ORDER BY Total_Flights DESC
LIMIT 10;
表列如下:
机场
|iata|airport|city|state|country|
航班\u统计
|originAirport|destAirport|FlightsNum|Cancelled|Month|
4条答案
按热度按时间vaj7vani1#
如果您在
union all
:oknwwptz2#
您可以对此进行测试,但您所处的情况是工会可能更好,因此您确实需要测试它并返回:
nkcskrwz3#
按机场筛选(内部联接)并在union all之前进行聚合,以减少传递给最终聚合缩减器的数据集。联合所有具有联接的子查询应该并行运行,并且比联合所有子查询之后使用更大的数据集进行联接要快。
优化Map联接并启用并行执行:
使用tez和矢量化,调整Map器和还原器的并行性:https://stackoverflow.com/a/48487306/2700344
kpbpu0084#
我认为分组集在这里不适用,因为您只按一个字段进行分组。
来自apachewiki:“groupby中的grouping sets子句允许我们在同一个记录集中指定多个groupby选项。”