一、Hive和Mysql的区别
二、hadoop和spark的区别
1、Hadoop有两个核心模块,分布式存储模块HDFS和分布式计算模块Mapreduce
2、Spark本身并没有提供分布式文件系统,因此spark的分析大多依赖于Hadoop的分布式文件系统HDFS
3、Hadoop的Mapreduce与spark都可以进行数据计算,而相比于Mapreduce,spark的速度更快并且提供的功能更加丰富
三、hive
Hive是建立在 Hadoop 上的数据仓库基础构架。
Hive的几个特点
Hive最大的特点是通过类SQL来分析大数据,而避免了写MapReduce程序来分析数据,这样使得分析数据更容易。
数据是存储在HDFS上的,Hive本身并不提供数据的存储功能
Hive是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如MySQL)。
数据存储方面:它能够存储很大的数据集,并且对数据完整性、格式要求并不严格。
数据处理方面:因为Hive语句最终会生成MapReduce任务去计算,所以不适用于实时计算的场景,它适用于离线分析。
四、hive创建分区/分桶表
Hive查询一般是扫描整个目录,但是有时候我们关心的数据只是集中在某一部分数据上,比如我们一个Hive查询,往往是只是查询某一天的数据,这样的情况下,可以使用分区表来优化,一天是一个分区,查询时候,Hive只扫描指定天分区的数据。
普通表和分区表的区别在于:一个Hive表在HDFS上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而 分区表数据存储时,是再划分子目录来存储的。一个分区一个子目录。主要作用是来优化查询性能。
详见:https://blog.csdn.net/wzq__janeGreen_/article/details/88795761
五、mapreduce执行过程
MapReduce过程大体分为两个阶段:map函数阶段和reduce函数阶段,两个阶段之间有有个shuffle。
reduce函数以分组的数据为数据源,对数据进行相应的分析,输出结果为最终的目标数据。
六、hive中join的mapreduce过程
1、reduce side join
这是最简单的一种join的方式,其主要思想如下:
在map阶段,map函数同时读取两个表t1和t2,为了区分两种来源的key/value数值对,对每条数据打一个标签 (tag),比如:tag=0表示来自文件File1,tag=2表示来自文件File2。即:map阶段的主要任务是对不同文件中的数据打标签。
在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list, 然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)。即:reduce阶段进行实际的连接操作。
2、map side join
之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的,因为shuffle阶段要进行大量的数据传输。
Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多 份,让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。
3、SemiJoin
SemiJoin,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会参加join操作的数据,则可以大大节省网络IO。
实现方法很简单:选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到 内存中。在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File2中不在File3中的 key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。
七、distinct和groupby的区别
distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分,因为用错场景的话,效率相差可以倍计。
1、单纯的去重操作使用distinct,速度是快于group by 的。group by使用的频率相对较高,但正如其功能一样,它的目的是用来进行聚合统计的,虽然也可能实现去重的功能,但这并不是它的长项。
2、distinct只是将重复的行从结果中出去;group by是按指定的列分组,一般这时在select中会用到聚合函数。
3、从性能来看,distinct对于索引的反应会比较敏感。在一般情况下,不管是加不加索引 group by 都比 distinct 快。
八、如何处理groupby造成的数据倾斜问题?
https://blog.csdn.net/leying521/article/details/93178185
1、将大数据量和小数据量分开计算
2、采用业务知识去掉过大或者过小数据
3、设置参数:set hive.groupby.skewindata=true; 负载均衡;
4、设置reduce数:
set hive.exec.reducers.bytes.per.reducer=128000000; 根据reduce处理文件大小设置;
set mapred.reduce.tasks=100; 指定reduce数目;
九、哪些情况下索引会失效?
1、条件中带or
2、对于多列索引,不是使用的第一部分,不会使用索引
3、like查询以%开头
4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5、如果mysql估计使用全表扫描要比使用索引快,则不使用索引
十、Hive和HBase的区别
https://blog.csdn.net/wshyb0314/article/details/81475475
十一、MySQL的引擎
https://blog.csdn.net/qq_34417408/article/details/80957620