参考答案:
1)应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
2)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫。
3)描应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
4)in 和 not in,用具体的字段列表代替,不要返回用不到的任何字段。in 也要慎用,否则会导致全表扫描。
5)避免使用模糊查询。
6)任何地方都不要使用select* from t。
参考答案:
Hive分桶通俗点来说就是将表或者分区中的文件分成几个文件去存储。比如表buck文件中本来是1000000条数据,由于在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便,所以我们可以分4个文件去存储。
参考答案:
(一)使用方面的区别
Hive
1)Hive是一个构建在Hadoop平台上的数据仓库。
2)Hive数据存放在HDFS之上。
3)Hive数据查询最终被转化为MapReduce。
HBase
1)HBase是一个基于HDFS平台的NoSQL数据库。
2)HBase数据存储在HDFS之上。
3)HBase是基于数据库本身的实时查询,而非运行MapReduce。
(二)特点的区别
Hive
1)Hive方便熟悉SQL的人,快速上手大数据分析。
2)Hive默认计算引擎是MapReduce,所以查询时间比较长。
3)Hive底层计算引擎也可以更换为Spark/Tez。
4)Hive中的表是纯逻辑表,只是表的定义,本身不存储和计算,完全依赖HDFS/MapReduce
HBase
1)HBase本身不支持SQL,需要通过集成Phoenix/Hive才支持SQL。
2)HBase基于一级索引Rowkey进行数据查询,所以查询速度比较快。
3)HBase底层基于Scan进行数据扫描,而非基于MapReduce
4)HBase中的表是物理表,有独立的物理数据结构,查询时可以将数据加载到内存,提升后续的查询效率
(三)局限性的区别
Hive
1)Hive目前仅支持ORCFile文件格式的数据更新操作,还需要提前开启事务支持。
2)Hive的运行依赖HDFS进行数据存储,默认依赖MapReduce进行数据计算。
HBase
1)HBase本身不支持SQL查询功能,需要通过与Phoenix集成实现。
2)HBase的运行依赖Zookeeper提供协调服务(配置服务、维护元数据、命名空间服务),依赖HDFS数据存储。
(四)应用场景的区别
Hive
1)Hive主要用于构建基于Hadoop平台的数据仓库,离线处理海量数据。
2)Hive提供完整的SQL实现,一般用于历史数据的分析、挖掘。
HBase
1)HBase适合用了大数据的实时查询、海量数据的存储。
2)HBase是近实时数据库,支持线上业务的实时查询。
数据格式
第一列(uid):用户id
第二列(dt):登录时间
第三列(status):用户状态
数据示例
1,2021-05-11,1
1,2021-05-12,1
1,2021-05-13,1
1,2021-05-14,1
1,2021-05-15,1
1,2021-05-16,1
1,2021-05-17,1
1,2021-05-18,1
2,2021-05-11,1
2,2021-05-12,1
2,2021-05-13,0
2,2021-05-14,1
2,2021-05-15,1
2,2021-05-16,0
2,2021-05-17,1
2,2021-05-18,0
3,2021-05-11,1
3,2021-05-12,1
3,2021-05-13,1
3,2021-05-14,0
3,2021-05-15,1
3,2021-05-16,1
3,2021-05-17,1
3,2021-05-18,1
参考答案:
(1)创建表
create table ulogin(
uid int, dt date, status int )
row format delimited fields terminated by ','
stored as textfile
location '/user/hive/warehouse/sca.db/ulogin/';
(2)加载数据
load data local inpath '/home/hadoop/shell/data/userlogin.txt' into table ulogin;
(3)具体实现
使用row_number()函数在组内给每行数据编号
使用的row_number 给日期排序
select uid, dt, row_number() over (partition by uid order by dt) gid from ulogin where status=1;
(4)具体实现
日期-rownum = gid,得到结果可以作为连续登录的依据
通过date_sub函数来获取连续登录的日期
select uid, dt, date_sub(dt, row_number() over (partition by uid order by dt)) gid from ulogin where status=1;
(5)具体实现
根据求得的gid作为分组条件,统计最终结果
通过group by count having分组统计,即可获取连续登入7日的用户
select uid,count(gid) from (select uid, dt, date_sub(dt, row_number() over (partition by uid order by dt)) gid from ulogin where status=1) as u group by uid,gid having count(gid)>=7;
参考答案:
1.HBase中的所有数据文件都存储在Hadoop HDFS文件系统上。
2.HBase中数据存储格式:
HFile: 是HBase中KeyValue数据的存储格式。HFile是Hadoop的二进制格式文件。
HLog File:是HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File
3. HBase与Zookeeper之间的关系
1)hbase meta表的位置存储在Zookeeper
2)hbase master 利用Zookeeper选举
3)master与RegionServer通信通过Zookeeper
4)Zookeeper存储hbase元数据信息