银行好像不咋问python,还是得放点心思在数据库上,银行里java和sql总得会一个吧。而且北京银行和中国银行这两天都不约而同的都问了我hive,不太会,关键是我之前其实搜过hive的内容,还不会答,哎,没过脑子有个屁用
介绍一下hive
- hive是基于hadoop的数据仓库
- 它适用于什么场景提出的/适用于什么场景
- 提供什么功能
- 怎么查询,查询的内部转化流程
- 缺点是什么
串起来
- hive是基于hadoop的数据仓库
- 设计是围绕海量数据的数据分析
- 使用类SQL 语言实现数据查询,查询语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,通过分布式计算后返回作业执行结果给用户
- 通过类SQL语句实现快速MapReduce统计,使MapReduce编程变得更加简单易行。
- 在hive上查询会有较高的延迟并且在作业提交和调度的时候需要大量的开销,所以hive不太适用于在线事物处理等需要低延迟的应用场景
- 但是这里的延迟也是相对的,如果数据量小,用Hive延迟肯定比Mysql要高,但是如果是应对数百万数据量,用hive比用mysql更高效
- hive的延迟是由什么引起的呢?Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。
- 为什么hive不建立索引?hive索引无法自动进行刷新,也就是当新的数据加入时候,无法为这些数据自动加入索引(Hive3.0开始索引已经被移除)
hive为什么不建议构建索引?
- 首先,不建议并不代表不支持,hive中可以构建索引,但是因为hive的底层结构,构建索引的效果往往不尽人意:索引占空间而且需要不断手动更新,不如分区、分桶来得划算(啥是分区、分桶)
- hive中适合构建索引的情景为:不更新的静态字段。要不然每次建立、更新数据后,都要重建索引以构建索引表。
- Hive2.3后用自动重写的物化视图替代了index的功能
非要构建索引怎么构建?
创建、查看与删除索引
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
[COMMENT "index comment"]
DROP INDEX [IF EXISTS] index_name ON table_name;
ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- [with deferred rebuild] 表明创建一个空索引,也就是说现在还不创建索引
- 其他说明见链接
hive和mysql有什么区别
- 1.Hive不支持数据的改写和添加,Mysql支持
- Hive不支持行级别的增删改的根本原因在于他的底层HDFS本身不支持。在HDFS中如果对整个文件的某一段或某一行内容进行增删改,势必会影响整个文件在集群中的存放布局。需要对整个集群中的数据进行汇总,重新切块,重新发送数据到每个节点,并备份,这样的情况是得不偿失的。所以HDFS的设计模式使他天生不适合做这个事
- Hive利用HDFS存储数据,利用MapReduce查询分析数据
- 2.Hive无索引,MySQL有索引
- Hive 支持索引(3.0 版本之前),但是 Hive 的索引与关系型数据库中的索引并不相同,比如,Hive 不支持主键或者外键。并且 Hive 索引提供的功能很有限, 效率也并不高,因此 Hive 索引很少使用
- 索引适用的场景:
- 适用于不更新的静态字段。以免总是重建索引数据。每次建立、更新数据后,都要重建索引以构建索引表。
建立索引的优缺点
- 索引是数据库中一个用于排序的数据结构,用来快速查询数据库中的数据。Mysql数据库使用二叉树树来实现索引的。
- 大大提高查找速度
- 缺点是占物理空间,对数据库进行增删改的时候也要动态的维护索引
数据仓库和数据库的区别
- 从逻辑上理解,二者没有区别,都是存放数据的地方
- 从数据量来说,数据仓库要比数据库更庞大的多。数据仓库 Datawarehouse (Amazon Redshift, Hive)主要用于海量数据的数据挖掘和数据分析,辅助做决策
- 数据库 Database (Oracle, Mysql, PostgreSQL)一次对少量数据,主要用于事务处理,即面向业务的增删查改
- 用途上的不同决定了这两种架构的特点不同
- 优化不同,数据库是事务性操作,所以是读写优化的
数据仓库中数据的来源
主要有三种:
-
结构化数据:一般来自于数据库,比如MySQL等关系型数据库的表中保存的记录(rows)。即承担OLTP功能的数据载体。这类数据最好处理,因为数据表达方式作为规范,约束性最好。
-
半结构化数据:该部分数据来源较多,包括用户行为日志(如app的页面访问记录)、平台或管理服务日志(tomcat、mysql等服务日志)等等,也包括存储于MongoDB等NoSQL数据库中的记录(Docs等)。这些数据一般以Json或XML等形式存在,在ETL时难度较大。
-
非结构化数据:包括图片、音频、视频和网页等,这些数据非常复杂,信息量也很大,一般不会直接抽取出来直接保存到数仓中,而是记录他们的元数据信息(metadata),举图片为例,可能保存该图片的产生时间、格式、大小等等,至于图片本身,一般通过url链接保存在对象或文件存储系统中。