面试准备-hive/sql篇

hive 系统架构

hive三种service

分别是cli,hiveserver和hwi。
cli是命令行工具,为默认服务,启动方式$HIVE_HOME/bin/hive 或 $HIVE_HOME/bin/hive –service cli。

hiverserver通过thrift对外提供服务,默认端口10000,启动方式为$HIVE_HOME/bin/hive–service hiveserver。

hwi为web接口,可以通过浏览器访问hive,默认端口9999,启动方式为$HIVE_HOME/bin/hive–service hwi。

hive UDF

讲一下数据库,SQl ,左外连接, 原理,实现

hive 分区

hive分区(partition)简介

  1. 一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

  2. 表和列名不区分大小写。

  3. 分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。

  4. 分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
    a、 单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。

b、双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列

1
2
3
LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08');
LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');

hive 实现wordcount

1
2
3
4
--分组统计
select word, count(*) from word.words group by word;
--分组排序
select word, count(*) counts from word.words group by word order by counts desc;

还了解过数据的什么知识? 数据库引擎?

索引本身是一个类似于平衡二叉树的高效数据结构

大表和小表join.

join 字段重复量小的放前面
表a,表b 是有先后顺序的,性能主要卡在reduce的次数

数据倾斜问题

几亿条数据如果只查询个别几条怎么办

把数据写到es中

es查询几乎是实时的

hive的外部表

内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除
外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。

  1. hive是内部表数据的管理者,但不是外部表数据的管理者
  2. 在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

load data local inpath直接把本地文件系统的数据上传到hdfs上

本质是load一个hdfs上的数据时会转移数据!

外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
hive 不一定能够查询外部表,很多外部表的建立都是为了共享数据,hive—> es;hive—>hbase

生产环境中为什么建议使用外部表?

  1. 因为外部表不会加载数据到hive,减少数据传输、数据还能共享。
  2. hive不会修改数据,所以无需担心数据的损坏
  3. 删除表时,只删除表结构、不删除数据。