当前位置:  开发笔记 > 前端 > 正文

在Ubuntu10.10中安装HIVE

一路配置下来没发现什么问题,然后就是利用HIVE跑SQL,执行和第一个Map/Reduce相符的程序了。1.创建表1createtablepackCount(userinfoSTRING,udidSTRING,ipSTRING,netSTRING,nothSTRING
一路配置下来没发现什么问题,然后就是利用HIVE跑SQL,执行和第一个Map/Reduce相符的程序了。
 
 
1.创建表
 
1
create table packCount (userinfo STRING, udid STRING, ip STRING, net STRING, noth STRING,noth2 STRING, noth3 STRING, phone STRING, num STRING, city STRING, pack STRING, numm STRING,downtime STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
2.上传数据
1
load data local inpath '/home/wjk/hadoop/cdh3/packin/active_log2012020101.txt' overwrite into table packCount;
3.写SQL
1
select pack ,COUNT(udid) as PV,COUNT(distinct(udid)) as UV from packCount where udid !=''and udid!='null' group by pack;
4.原数据有11个字段,第一次建表只建了9个字段。需要删除重建
首先使用了:dfs -rmr /user/hive/warehouse/packcount;
但是再次创建表时一直提示表packCount已经存在,后来想到了再Hive中没有删除表,应该在hive>运行drop table packCount;
 
参照:http://www.hadoopor.com/thread-409-1-1.html
 
======遗留问题========
 
1.注意了一下load的执行过程,最后又一个delete from hdfs不知道要怎么理解
 
1
HIVE load数据的执行过程:
2
hive> load data local inpath '/home/wjk/hadoop/cdh3/packin/active_log-2012020101.txt' overwrite into table packCount;
3
Copying data from file:/home/wjk/hadoop/cdh3/packin/active_log2012020101.txt
4
Copying file: file:/home/wjk/hadoop/cdh3/packin/active_log2012020101.txt
5
Loading data to table default.packcount
6
Deleted hdfs://localhost:9000/user/hive/warehouse/packcount
7
OK
8
Time taken: 2.611 seconds
文件从本地上传到Hive的数据仓库,权威指南(中文版)381页有提示说:load是把文件从hdfs://.......移动到Hive的仓库目录中packCount表的目录,即hdfs://user/hive/warehouse/packCount,"只有源文件和目标文件在同一个文件系统中移动才会成功",那么理解为文件从本地磁盘,先上传到hdfs,然后再移动到Hive的数据仓库,而hdfs只作为一个中转站,所有最后才有一个delete这样理解总觉得不对???求大侠帮忙解释
 
又有:"hive中删除表,数据是不删除的,因为本身数据就是dfs中,它只是load进去,元数据只是记录了表与这些数据之间的关系",这样又该怎么解释这个delete呢??迷惑
 
==================2.24====================
 
#1.看到一句,"Load语句中的overwrite关键字告诉Hive删除表所对应目录中已有的所有文件,如果省去这一关键字,Hive就简单的把新的文件加入目录",所有我怀疑最后的删除是不是由overwrite引起的,然后进行试验。
 
 
#2.首先在Hive下执行:drop table packCount;然后再执行:dfs -rmr /user/hive/warehouse/packcount;控制台报错,提示“No such file or directory.”在dfs中查看了下果然是没有这个目录了。
    原因:因为我用的一直是托管表,在Drop的时候元数据和数据会一起被删除。(如果是外部表,external声明的表,则只会删除元数据)
 
 
#3.重新建表,load数据,这次去除overwrite关键字。
1
hive> load data local inpath '/home/wjk/hadoop/cdh3/packin/active_log-2012020101.txt' into table packCount;
2
Copying data from file:/home/wjk/hadoop/cdh3/packin/active_log-2012020101.txt
3
Copying file: file:/home/wjk/hadoop/cdh3/packin/active_log-2012020101.txt
4
Loading data to table default.packcount
5
OK
6
Time taken: 40.711 seconds
果然就没有了那个delete!原来都是overwrite惹的祸.
 
 
 
#4.梳理下思路,也许可以这么理解:在load执行到load data to table的时候会进行一下判断,如果使用了overwrite关键字,就要先删除对应目录的所有文件,所有会有一个Deleted hdfs://localhost:9000/user/hive/warehouse/packcount的操作,在delete之后将data放到dfs中,再load到Hive中。而Hive中就是元数据的存在形式,实际上数据就是在dfs中存放。最后在drop的时候会根据是托管表还是外部表进行删除。
 
####:个人愚见,如果不对还希望各位前辈多加指正,谢谢

摘自王建奎Jerrick的博客
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有