使用Hive连接表

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

我们可能知道关系数据库建模和设计中的专家通常花费很多时间设计标准化数据库或者模式。
数据库归一化是一种技术,用于防止数据丢失,冗余和其他异常,因为更新和检索数据。

专家遵循许多规则到达归一化数据库,但规则1是我们必须最终结束一组表。
(存储所有数据的一个大型表格不是正常的 - 双关语。
)有异常,具体而言,许多表的法律通常紧密遵循,特别是对于支持交易或者分析处理的数据库(商业智能,例如)。

当我们开始查询和分析数据时,基于使用SQL之间的定义关系加入表 - 这意味着当我们开始加入表时,磁盘最终忙于服务器,并且繁忙的磁盘通常会导致用户响应较慢的磁盘。
但是,好消息是调整RDBMS和EDWS以尽可能快地进行连接。

所有这一切都与Hive中的加入有什么关系?
嗯,请记住,Hive的底层操作系统是(惊喜!)Apache Hadoop:MapReduce是加入表的引擎,而Hadoop文件系统(HDFS)是底层存储。
这是想要创建,管理和分析大型表的用户的好消息。

解锁隐藏在大规模数据结构中的信息的可能性是令人兴奋的。
然而,与Hive连接通常不会在RDBMS/EDW世界中表现,因此首次使用系统响应的"轻型"常见的用户。

请记住,MapReduce和HDFS针对具有大数据分析的吞吐量进行了优化,并且在本世界中,延迟 - 用户响应时间(换句话说)通常很高。
Hive专为批量分析处理而设计,而不是用于快速在线交易处理。
想要在Apache Hadoop上使用SQL最佳表现的用户具有可用的解决方案。

当我们开始使用Hive连接表时,请记住此动态。
另请注意,Hive Architects通常在某种程度上使其数据库无限制,因此具有较少的较大表是常见的。
这就是为什么提供了诸如结构和阵列之类的复杂数据类型。
我们可以使用这些复杂的数据类型将更多数据包装到单个表中。

由于HIVE表通过HDF读取和写入通常涉及非常大的数据块,我们可以在一个表中完全管理的数据越多,整体性能越好。

磁盘和网络访问速度慢于内存访问,因此最小化HDFS尽可能地读取和写入。

有了这个背景信息,我们可以用Hive制作加入。
幸运的是,Hive发展社区是现实的,理解的是,用户想要并需要加入Hiveql的表格。
这种知识与EDW增强尤为重要。
使用案例,例如"查询"档案通常需要加入数据分析。

以下是使用飞行数据表的Hive Join示例。
列表向我们展示如何从较大的FlightInfo2007和FlightInfo2008表中创建和显示MyFlightInfo2007表和MyFlightInfo2008表。
该计划一直在使用CTA创建MyFlightInfo2007和MyFlightInfo2008表来说明如何在Hive中执行连接。

该图显示了使用Squirrel SQL客户端与MyFlightInfo2007和MyFlightInfo2008表的内部连接的结果。

Hive支持Equi-Joins,特定类型的连接只使用连接谓词中的平等比较。
(在m8.flightnum = m7上.flightnum是Equi-Join的一个示例。
)不支持其他比较器,例如小于(<)。
此限制仅是因为底层Mapreduce引擎的限制。
此外,我们不能使用或者在on子句中使用。

该图说明了内连接的前面示例和另外两个Hive连接类型。
请注意,我们可以通过查看MyFlight2007和MyFlight2008表的内容来确认内部连接的结果。

下图说明了内部连接如何使用Venn图来使用Venn图,以防我们不熟悉该技术。
这里的基本思想是内连接返回两个表之间匹配的记录。
因此,内部连接是一个完美的分析工具,以确定2007年7月和2008年7月的俄国委员会(芝加哥)的航班与ord(芝加哥)相同。

优化Hive Joins是Hive社区中的热门话题。
有关当前优化技术的更多信息,请参阅Hive Wiki上的Join Optimization页面。