几个Hive面试问题

时间:2016-01-27 22:31:52

标签: hadoop hive hiveql hadoop2 hadoop-streaming

我最近在接受公司采访时遇到了一些问题。由于我是Hadoop的新手,有谁能告诉我正确的答案?

问题:

  1. Hive中“Sort By”和“Group by”之间的区别。他们是如何工作的?
  2. 如果我们在Hive中的任何SQL查询中使用“Limit 1”,则Reducer是否有效。
  3. 如何优化Hive性能?
  4. “内部表”和“外部表”之间的区别
  5. Hive和SQL之间的主要区别是什么
  6. 请为我提供一些有用的资源,以便我能够以更好的方式学习。感谢

5 个答案:

答案 0 :(得分:5)

PFB答案:

1。 Hive中“Sort By”和“Group by”之间的区别。它们是如何工作的?

答。 SORT BY对每个reducer的数据进行排序,它提供了reducer中行的排序。如果有多个减速器,“排序依据”可能会给出部分有序的最终结果。 而GROUP BY按指定列聚合记录,允许您在非分组列(例如SUM,COUNT,AVG等)上执行聚合功能。

2。如果我们在Hive中的任何SQL查询中使用“Limit 1”,则Reducer是否有效。

答。我认为Reducer会起作用,因为根据Hive文档 - Limit表示要返回的行数。返回的行是随机选择的。以下查询随机返回t1中的5行。

SELECT * FROM t1 LIMIT 5

必须随机选择,必须从Reducer获得完整的结果输出。

- 如何优化Hive性能?

答。这些链接应该回答这个

- “内部表”和“外部表”之间的差异

答。 “内部表”也称为管理表,是由Hive管理的表。将HDFS中的数据指向此表时,数据将移至Hive默认位置/ ust / hive / warehouse /。然后,如果删除了这样的内部表,则会删除数据。

另一方面,“外部表”是用户管理的,加载后数据不会移动到hive默认目录,即可以指定任何自定义位置。连续地,当您删除此类表时,不会删除任何数据,只会删除表模式。

- Hive和SQL

之间的主要区别是什么?

答。 Hive是一个位于hadoop之上的Datawarehousing层,它为用户提供类似于行表接口的SQL,用于分析底层数据。它采用HiveQL(HQL)语言,基于SQL-92标准。

SQL是用于访问和操作数据库的标准RDBMS语言。

答案 1 :(得分:0)

我也是Hadoop和Hive的新手,所以我无法给你一个完整的答案。

根据我在“Hadoop The Definitive Guide”一书中所读到的,Hive和SQL之间的主要区别在于Hive(HiveQL)是在考虑MapReduce的情况下创建的。 Hive的SQL方言应该让人们更容易与Hadoop交互,而无需了解很多关于Java的知识(无论如何,SQL都为数据专业人员所熟知)。

随着时间的推移,Hive变得更加符合SQL标准。它混合了MySQL和Oracle的SQL方言与SQL-92。

主要差异

根据我的阅读,最大的区别是RDBMS的架构通常是架构写。这意味着在数据库中加载数据时,数据需要符合模式。在Hive中,它在读取上使用模式,因为它在加载时不会验证数据。

Hadoop获取的信息权威指南

非常好的书,并对所涉及的所有技术进行了很好的概述。

编辑:

对于外部和内部表格,请查看此回复:

Difference between Hive internal tables and external tables?

有关排序依据和分组依据的信息

排序方式:

  

Hive使用SORT BY中的列对行进行排序,然后将行提供给reducer。排序顺序取决于列类型。如果列是数字类型,则排序顺序也是数字顺序。如果列是字符串类型,则排序顺序将是字典顺序。

排序方式与排序方式之间的差异

(取自提供的链接,这可能有助于Group By和Sort By之间的区别)

  

Hive支持SORT BY,它对每个reducer的数据进行排序。 “order by”和“sort by”之间的区别在于前者保证输出中的总顺序,而后者仅保证在reducer中排序。如果有多个减速器,“排序依据”可能会给出部分有序的最终结果。

     

注意:单个SORT BY和CLUSTER BY之间的区别可能会令人困惑。不同之处在于CLUSTER BY按字段分区,如果有多个reducers分区,则为SORT BY,以便在reducers之间统一分配数据(和加载)。

     

基本上,每个reducer中的数据将根据用户指定的顺序进行排序。

分组依据:

Group By使用聚合完成。它几乎与你在其他任何SQL方言中所做的一样。

    INSERT OVERWRITE TABLE pv_gender_sum
    SELECT pv_users.gender, count (DISTINCT pv_users.userid)
    FROM pv_users
    GROUP BY pv_users.gender;

此查询选择pv_users.gender并从users表中计算不同的user_ids。为了统计性别中的用户,您首先必须将所有特定性别的用户组合在一起。 (根据下面的链接从组中查询)

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+GroupBy

有关优化Hive性能的信息

http://hortonworks.com/blog/5-ways-make-hive-queries-run-faster/

优化联接

https://www.facebook.com/notes/facebook-engineering/join-optimization-in-apache-hive/470667928919/

一般Hive性能提示

https://streever.atlassian.net/wiki/display/HADOOP/Hive+Performance+Tips

一些额外资源

SQL to Hive Cheat Sheet

http://hortonworks.com/wp-content/uploads/downloads/2013/08/Hortonworks.CheatSheet.SQLtoHive.pdf

Hive LIMIT文档

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select#LanguageManualSelect-LIMITClause

祝你好运!

答案 2 :(得分:0)

从Hive 0.10.0开始,如果设置了任务对话hive.fetch.task.conversion = more,那么简单的select语句(例如从表名LIMIT n中选择column_name)可以避免map reduce。

答案 3 :(得分:0)

1。 Hive中“排序依据”和“分组依据”之间的区别。它们如何工作?

  • SORT BY:它在为Map reduce作业定义的每个reducers中对结果进行排序。不一定要按排序顺序输出,但来自每个reducer的输出都应按顺序排列。检查下面的例子!我在11个节点的群集中运行它。

enter image description here

  • GROUP BY:它有助于聚合数据。 sum(),count(),avg(),max(),min(),collect_list(),collect_set()均使用分组依据。就像基于相同功能汇总结果一样。示例:有一个状态列和人口列,我们根据状态进行汇总,那么将有29个具有sum(population)的不同值。

2。如果我们在Hive中的任何SQL查询中使用“限制1”,则Reducer是否可以工作。

  • 从db.table限制1中选择*:语句从不包含reducers,您可以使用describe语句进行检查。 enter image description here

  • 从db.table中按列顺序选择*:使用reducers或存在聚合时。查看下面的屏幕截图。enter image description here

3。如何优化Hive性能?

  • 使用Tez会话

  • 使用存储分区和分区

  • 使用Orc文件格式

  • 使用矢量化

  • 使用CBO 4。 “内部表”和“外部表”之间的区别

  • 内部表:配置单元中存储的元数据和数据。如果删除表,则会自动删除整个架构和数据。

  • 外部表:仅元数据由配置单元处理。数据由用户处理。如果删除表,则只会删除架构,数据保持不变。对于创建外部表,需要在create语句中使用external关键字,还需要指定放置数据的位置。

5。 Hive和SQL之间的主要区别是什么

  • Hive是一种数据仓库工具,旨在处理hadoop上的结构化数据,而SQL用于RDBMS上的结构化数据。

答案 4 :(得分:-2)

如果我们在select子句中使用limit,

Reducer将不会运行。

select * from table_name limit 5;