本文目录
一、hive架构相关
遇到这类问题,可以灵活的去回答,比如可以结合平时使用hive的经验作答,也可以结合下图从数据的读入、解析、元数据的管理,数据的存储等角度回答:
二、hive的特点
本题主要为了考察对hive的整体使用场景的掌握程度,毕竟只有知道了hive的特点,才能有针对性的在实际项目中的合适场景下使用hive。
可以从下面四个角度去分析:
-
数据存储位置
Hive的数据存储在hdfs上,元数据可以存储在指定的地方比如mysql,PostgreSQL等。
-
数据更新
Hive处理数据时一般不对数据进行改写,因为它不支持行级别的增删操作,如果要进行更新数据,一般可以通过分区或者表直接覆盖。
-
执行效率
Hive 执行延迟较高。虽然在小数据量时传统数据库延迟更低,但是当数据规模大到超过传统数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。
-
数据规模
Hive 支持大规模的数据计算,通常是PB级别的数据。
三、内部表和外部表的区别?
- 内部表(MANAGED_TABLE):内部表其实就是管理表,当我们删除一个管理表时,Hive 也会删除这个表中数据。因此管理表不适合和 其他工具共享数据。
- 外部表(EXTERNAL_TABLE):删除该表并不会删除掉原始数据,删除的是表的元数据。
四、4个by的区别?
- Sort By:在同一个分区内排序
- Order By:全局排序,只有一个Reducer;
- Distrbute By:类似 MapReduce 中Partition,进行分区,一般结合sort by使用。
- Cluster By:当 Distribute by 和 Sort by 字段相同时,可以使用Cluster by方式。Cluster by 除了具有 Distribute by 的功能外还兼具 Sort by 的功能。但是只能升序排序,不能指定排序规则为ASC或者DESC。
五、介绍一下有哪些常用函数?
5.1、行转列函数
-
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串。
例如: concat( aa, ‘:’, bb) 就相当于把aa列和bb列用冒号连接起来了,aa:bb。
-
CONCAT_WS(separator, str1, str2,…):CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
-
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
5.2、列转行函数
-
EXPLODE(col):将hive某列中复杂的array或者map结构拆分成多行。
-
LATERAL VIEW:常和UDTF函数一起使用。
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
5.3、Rank排名函数
- RANK() 排序相同时会重复,总数不会变;
- DENSE_RANK() 排序相同时会重复,总数会减少;
- ROW_NUMBER() 根据顺序计算排名。
在实际开发中,以上三个rank函数通常是和开窗函数一起使用的。
5.4、窗口函数(开窗函数)
-
OVER():用于指定分析函数工作时的数据窗口大小,这个数据窗口大小可能会随着行的变而变化;
-
CURRENT ROW:当前行;
-
n PRECEDING:往前n行数据;
-
n FOLLOWING:往后n行数据;
-
UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从