hive是半个数据库,真正数据是存储在hdfs中,元数据(表结构)存在derby[mysql]里,它会把HQL语句(类SQL)翻译成MapReduce(hive1.x),spark....(hive2.x),(hive2.x不提倡使用MapReduce,但还可以做测试)
hive的查询效率取决于底层的计算引擎~
hive应用场景:静态数据分析,数据不会频繁变化,不需要实时响应结果。
hive的限制:不支持行级的处理(插入,删除),只能插入,删除一张表。不支持事物。
注意下载bin(编译好的二进制),我下载成源代码了。。。
vim /etc/profile
# 文件中添加
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export PATH=$PATH:$HIVE_HOME/bin
# 存盘退出后执行,使配置立马生效
source /etc/profile
检查配置是否生效:
echo $HIVE_HOME
# 若输出hive的安装目录,则说明配置生效
hive
# 若出现内容则说明path配置生效,没生效会提示找不到命令(报错是因为hive没有安装完,正常)
cd /usr/local/src/hive/conf
cp hive-default.xml.template hive-site.xml
# 修改 为false,默认是true。(原因不明)
hive.metastore.schema.verification
#创建目录,用来替换${system:java.io.tmpdir} 注意有多处,都需要替换,见下图
mkdir /usr/local/src/hive/tmp
# 用当前登录用户替换${system:user.name},见下图
正常生产环境中,hive的表结构和元数据是存储在MySQL、Oracle、postgresql等数据库中的,但是我们只是用hive做测试,则只需要初始化hive自带的测试数据库derby即可。命令如下(hive安装路径下执行)
# 如果MySQL,就把最后的数据库改为mysql
schematool -initSchema -dbType derby
# 注意此命令会在当前目录下创建metastore_db,所以每次执行命令一定要在同一路径下执行
# 之后,hive安装路径下会出现metastore_db文件夹(derby数据库)
# 如果hive出现什么错误,则可以把metastore_db文件夹删除,然后重新初始化
hive
# 注意:需在之前启动hadoop集群,hive是依赖hadoop的
hive> show databases;
# 使用默认数据库
hive> use default;
hive> show tables;
hive> create table wordcount (line string);
hive> desc wordcount;
# hive的临时文件
hive> dfs -ls /tmp/hive/root;
# hive的真实数据
hive> dfs -ls /user/hive/warehouse/wordcount;
# 加载数据,hdfs的根目录下的input.txt文件,覆盖到hive表wordcount中
hive> load data inpath '/input.txt' overwrite into table wordcount;
# 注意:真正的数据并没有写入到hive中,而是与hdfs中的数据建立了一种映射,我们就可以通过表,去访问文件了
hive> select * from wordcount;
# 将line字段按空格分隔为数组
hive> select split(line, ' ') from wordcount;
# 将数组拆分为新的单独字段
hive> select explode(split(line, ' ')) as word from wordcount;
# 将上个命令的结果当成新表然后group by
hive> select word,count(1) from (select explode(split(line, ' ')) as word from wordcount)w group by word;
# HQL会把此命令翻译为MapReduce的job
1、http://www.sogou.com/labs/resource/q.php 下载搜狗日志文件(min版)
2、日志文件格式化为1,2,3,6列用逗号分隔的sougou.dic文件
3、把sougou.dic文件放到hdfs中
[root@sunsk01 src]# hadoop fs -mkdir /sougou/
[root@sunsk01 src]# hadoop fs -put sougou.dic /sougou/
4、建表,映射到sougou.dic文件上
hive> create table sgr (qtime string, qid string, qword string, url string) row format delimited fields terminated by ',';
# 创建一张hive表,该行记录字段之间用逗号分隔。
hive> load data inpath '/sougou/' overwrite into table sgr;
# 检测映射是否成功
hive> select count(1) from sgr;
5、查询热搜榜
hive> select keyword,count(1) c from (select qword as keyword from sgr) kw group by keyword order by c desc limit 10;
# 结果:
# OK
# [汶川地震原因] 335
# [哄抢救灾物资] 308
# [封杀莎朗斯通] 110
# [印尼排华是怎么回事] 77
# [朝鲜能不能打败韩国] 60
# [杨丞琳辱华惨痛下场] 48
# [印尼残害女华人+图片] 47
# [xiao77] 34
# [gay] 31
# [97sese] 30
# Time taken: 66.374 seconds, Fetched: 10 row(s)
# emmm... 知道大家都在搜狗搜什么了。。。