【大数据面试题】(三)Hive 基础知识及优化总结1

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 【大数据面试题】(三)Hive 基础知识及优化总结1

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。


Metastore (hive元数据)

Hive将元数据存储在数据库中,比如mysql 、derby。Hive中的元数据包括表的名称,表的列和分区及其属性,表的数据所在的目录。


Hive数据存储在HDFS,大部分的查询、计算由mapreduce完成


Hive数据仓库于数据库的异同

(1)由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,
 再无类似之处。
(2)数据存储位置。  hdfs   raw local fs
(3)数据格式。 分隔符
(4)数据更新。hive读多写少。Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
  INSERT INTO … VALUES添加数据,使用UPDATE … SET修改数据  不支持的
  HDFS 一次写入多次读取
(5)执行。hive通过MapReduce来实现的  而数据库通常有自己的执行引擎。 
(6)执行延迟。由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架
(7)可扩展性。
(8)数据规模。


hive几种基本表类型:内部表、外部表、分区表、桶表


内部表(管理表)和外部表的区别:


创建表

外部表创建表的时候,不会移动数到数据仓库目录中(/user/hive/warehouse),只会记录表数据存放的路径

内部表会把数据复制或剪切到表的目录下

删除表

外部表在删除表的时候只会删除表的元数据信息不会删除表数据

内部表删除时会将元数据信息和表数据同时删除


表类型一、管理表或内部表Table Type: MANAGED_TABLE

create table if not exists dept(
deptno int,
deptname string,
address string
)
row  format delimited fields terminated by '\t';
//加载HDFS文件到Hive表中
load data inpath '/input/dept.txt' into table dept;
//用来指定原文件的列分隔符
row  format delimited fields terminated by '\t';
load 如果操作的HDFS上的文件,代表着会移动或者剪切文件
desc formatted dept;  //描述表结构信息
Location:               hdfs://bigdata/user/hive/warehouse/db01.db/dept  
Table Type:             MANAGED_TABLE


表类型二、外部表

create  external table emp(
empno int,
empname string,
empjob string,
mgno int,
birthday string,
salary float,
bonus float,
depno int
)
row  format delimited fields terminated by '\t'
location '/input/demo';
//描述表结构
desc formatted emp;
Location:               hdfs://bigdata/input/demo    
Table Type:             EXTERNAL_TABLE 
删除内部表
drop table dept;
删除外部表
drop table emp;
清空表数据
truncate table student;


表类型三、分区表


分区表创建表的时候需要指定分区字段,分区字段与普通字段的区别:分区字段会在HDFS表目录下生成一个分区字段名称的目录,而普通字段则不会,查询的时候可以当成普通字段来使用,一般不直接和业务直接相关。

create  table emp_part(
 empno int,
 empname string,
 empjob string,
 mgrno int,
 birthday string,
 salary float,
 bonus float,
 deptno   int
 )
 partitioned by (province string)
row format delimited fields terminated by '\t';
//向分区表加载数据
load data local inpath '/home/user01/emp.txt' into table emp_part partition (province='CHICAGO');
//描述表信息
desc formatted  emp_part;
//查询全表数据
select * from emp_part;
//查询分区字段表数据
select * from emp_part where province='CHICAGO';
//查看分区信息
show partitions emp_part;
//增加分区
aler table emp_part add [if not exist] partition(provine='zhejiang',city='hangzhou') 
//删除分区
aler table emp_part drop [if  exist] partition(provine='zhejiang',city='hangzhou')

外部分区表

create external  table  dept_part(
deptno int,
deptname string,
address string
)
partitioned by (province string)
row  format delimited fields terminated by '\t'
location '/input/demo';
//手动增加分区字段及外部目录:
alter table dept_part add partition (province='BOSTON') location '/input/demo/BOSTON';
//手动增加分区字段(自动生成分区目录)
alter table dept_part add partition (province='NEW YORK');


表类型四:桶表


将内部表,外部表和分区表进一步组织成桶表

可以将表的列通过Hash算法进一步分解成不同的文件存储

create external  table  dept_part(
deptno int,
deptname string,
address string
)
partitioned by (province string)
row  format delimited fields terminated by '\t'
location '/input/demo';
//手动增加分区字段及外部目录:
alter table dept_part add partition (province='BOSTON') location '/input/demo/BOSTON';
//手动增加分区字段(自动生成分区目录)
alter table dept_part add partition (province='NEW YORK');


创建表的方式


方式一 create + load

create [external] table table_name(
    col1_name col1_type,
    ...
    coln_name coln_type
    )
    row  format delimited fields terminated  by '\t';
   //load加载数据
    laod data [local] inpth '本地文件(linux)/HDFS' [overwrite] into table  table_name;


方式二 like + load

//复制表结构
    create table tableB like tableA;    //首先必须要有tableA
    //load加载数据
    laod data [local] inpth '本地文件(linux)/HDFS' [overwrite] into table  table_name;


方式三 as 创建表的同时加载数据

create table tableB row format 
delimited filelds termianted by ','  
as select * from tableA;   //首先必须要有tableA
create table emp_as 
row format delimited fields 
terminated by ',' 
as select empno,empname,salary from emp_part1;


方式四 create + insert

//创建表
create table emp_insert(
id int,
name string,
job string,
salary float
)
row format  delimited fields terminated by ',';
//insert into 加载数据
insert into table emp_insert select empno,empname,empjob,salary from emp_part1 where day='20170308' and  hour='14';


加载数据的方式


加载方式一

//加载本地文件到Hive表   --使用存储介质(移动硬盘)
laod data local inpth '本地文件(linux)' [overwrite] into table  table_name;


加载方式二

//加载HDFS文件到hive表   --通过Flume等日志收集框架
laod data  inpth 'HDFS文件' [overwrite] into table  table_name;


加载方式三

//加载数据示覆盖已有的数据
laod data [local] inpth '文件' overwrite  into table;
//**hdfs  dfs -put 本地目录及文件 表在HDFS所在的目录
 desc formatted table_name;  --找到table_name在HDFS上的目录


加载方式四

//创建表时通过select查询语句加载数据
 create table tableB row format delimited filelds termianted by ','  as select * from tableA;


加载方式五

//先创建表,通过insert into table table_namea  select  *  fom tableB


加载方式六

//创建外部表示通过location指定数据所在目录
create extrnal table_name(
     col1_name col1_type,
     ...
     coln_name coln_type
)
row  format delimited fields terminated  by '\t';
location  'HDFS上的目录'


几种导出数据的方式

1.insert overwrite ... 导出到本地目录
     insert overwrite local directory '/home/user01/export' row format delimited fields terminated by ' ' select * from emp_part1;
    2.insert overwrite ... 导出到HDFS之上
    insert overwrite directory '/export' select * from emp_part1 where day='20170308';
    3.hive -e 'HQL query'  >> test
    bin/hive -e 'select * from db01.student' >> test.txt
    4)sqoop


Hive 自定义函数函数


UDF 一进一出 处理原文件内容某些字段包含 [] “”

UDAF 多进一出 sum() avg() max() min()

UDTF 一进多出 ip -> 国家 省 市


Hive4种排序


1.order by //可以指定desc 降序 asc 升序


order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。


2.sort by 【对分区内的数据进行排序】


sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只会保证每个reducer的输出有序,并不保证全局有序。sort by不同于order by,它不受Hive.mapred.mode属性的影响,sort by的数据只能保证在同一个reduce中的数据可以按指定字段排序。使用sort by你可以指定执行的reduce个数(通过set mapred.reduce.tasks=n来指定),对输出的数据再执行归并排序,即可得到全部结果。


3.distribute by 【对map输出进行分区】


distribute by是控制在map端如何拆分数据给reduce端的。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。sort by为每个reduce产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。



相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
2月前
|
SQL 分布式计算 运维
如何对付一个耗时6h+的ODPS任务:慢节点优化实践
本文描述了大数据处理任务(特别是涉及大量JOIN操作的任务)中遇到的性能瓶颈问题及其优化过程。
|
7天前
|
存储 NoSQL 大数据
大数据 数据存储优化
【10月更文挑战第25天】
22 2
|
30天前
|
SQL 分布式计算 NoSQL
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
22 1
大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
61 20
Android经典面试题之图片Bitmap怎么做优化
|
30天前
|
存储 大数据 分布式数据库
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 & RowKeys
30 1
|
1月前
|
分布式计算 Java 大数据
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
35 0
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
|
2月前
|
SQL 关系型数据库 MySQL
面试官:limit 100w,10为什么慢?如何优化?
面试官:limit 100w,10为什么慢?如何优化?
178 2
面试官:limit 100w,10为什么慢?如何优化?
|
30天前
|
SQL 存储 监控
大数据-161 Apache Kylin 构建Cube 按照日期、区域、产品、渠道 与 Cube 优化
大数据-161 Apache Kylin 构建Cube 按照日期、区域、产品、渠道 与 Cube 优化
43 0
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
33 0
|
1月前
|
SQL 分布式计算 大数据
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
30 0
下一篇
无影云桌面