整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

12.7.4 子查询

hadoop 小红牛 8℃ 0评论

子査询是内嵌在另一个SQL语句中的SELECT语句。Hive对子査询的支持 很有限,它只允许子査询出现在SELECT语句的FROM子句中。

其他数据允许子查询出现在几乎任何表达式可以出现的地方,例如在SELECT语句带检索值的列表中或WHERE子句中。很多使用子查询的地方都可以重写为连接操作。因此,如果发现Hive不支持你写的子查询,可以看看能不能把它写成连接操作。例如,一个IN子查询可以写成一个半连接或内连接(参见12.7.3节)。

下面的査询可以找到每年每个气象站最高气温的均值:

SELECT station, year, AVG(max—temperature)
FROM (
    SELECT station, year, MAX(temperature) AS max一temperature
    FROM records2
    WHERE temperature != 9999
     AND (quality = 0 OR quality = 1 OR quality = 4 OR quality = 5 OR quality = 9) GROUP BY station, year 
)mt
GROUP BY station, year;

这里的子查询用于计算每个气象站/日期组合中的最高气温,然后外层査询 使用AVG聚集函数计算这些最高读数的均值。

外层査询像访问表那样访问子査询的结果,这是为什么必须为子査询赋予 一个别名(mt)的原因。子査询中的列必须有唯一的名称,以便外层査询可以 引用这些列。

12.7.5视图

视图是一种用SELECT语句定义的“虚表”(virtual
table)。视图可以用来以 一种不同于磁盘实际存储的形式把数据呈现给用户。现有表中的数据常常
需要以一种特殊的方式进行简化和聚集以便于后期处理。视图也可以用来 限制用户,使其只能访问被授权可以看到的表的子集。

在Hive中,创建视图时并不把视图“物化”(materialize)存储到磁盘上。相
反,视图的SELECT语句只是在执行引用视图的语句时才执行。如果一个视 图要对“基表”(base
table)进行大规模的变换,或视图的査询会频繁执行,你可以选择新建一个表,并把视图的内容存储到新表中,以此来手工物化 它(参见 12.6.4
节对 CREATE TABLE…AS SELECT 语句的讨论)。

我们可以用视图重写前一节中的査询,它用于査找每年各个气象站气温最 大值的均值。首先,让我们为有效记录(即有特定quality值的记录)创建 一个视图:

CREATE VIEW valid_records 
AS
SELECT *
FROM records2
WHERE temperature != 9999
AND (quality = 0 OR quality = 1 OR quality = 4 OR quality = 5 OR quality = 9);

创建视图时并不执行査询,査询只是存储在metastore中。SHOW TABLES命 令的输出结果里包括视图。可以使用DESCRIBE EXTENDED view_name命令来査看某个视图的详细信息,包括用于定义它的那个査询。

接下来,让我们为每个观测站每年的最高气温创建第二个视图。这个视图 基于 valid_record 视图:

CREATE VIEW max_temperatures (station, year, max__temperature)
AS
SELECT station, year, MAX(temperature) FROM valid_records GROUP BY station, year;

在这个视图定义中,我们显式地列出了列的名称。我们这么做是因为最髙 气温列是一个聚集表达式,如果不指明,Hive会自己创建一个别名(例如 _c2)。我们也可以在SELECT语句中使用AS子句来为列命名。

有了这两个视图,现在我们就可以执行査询了:

SELECT station, year, AVG(max_temperature)
FROM max_temperatures 
GROUP BY station, year;

这个査询的结果和前面使用子査询的査询是一样的。特别地,Hive为它们
所创建的MapReduce作业的个数也是一样的:都是两个,每个GROUP BY
使用一个。从这个例子可以看到,Hive可以把使用视图的査询组织成一系 列作业,效果与不使用视图的査询一样。换句话说,即使在在执行时,
Hive也不会在不必要的情况下物化视图。

Hive中的视图是只读的,所以无法通过视图为基表加载或插入数据。

转载请注明:全栈大数据 » 12.7.4 子查询

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址