hive数据定义与操作

来源:互联网 发布:radio选择事件js 编辑:程序博客网 时间:2024/05/17 08:21
DDL
DML
s.* ---->.代表任意一个字符
*0或多个字符
hive配置文件:
hive-site.xml
由hive-default.xml.template文件复制得到
在hive-site.xml文件中配置Hive默认的数据文件存放目录
<property>
   <name>hive.metastore.warehouse.dir</name> <!--  指定HDFShive数据存放目录。HDFS自动创建 --> 
   <value>/hive-1.1.0/warehousedir/home</value> <!--   HDFS路径。默认:/user/hive/warehouse --> 
</property> 





创建数据库:
hive会为每个创建的数据库在hdfs上创建一个目录,数据库中的表会以子目录的形式存储
default数据库没有自己的目录
查看:
查看某个已经存在的数据库:describe database sougou;
切换数据库:use sougou;
显示数据库中的表: show tables sougou;
为数据库添加描述信息:create table sougou comment ‘sougou is a table ’;
删除数据库
drop database sougou_test;
数据库不存在的会报错
判断数据库是否存在
drop database if exists sougou_test;
hive不允许删除一个存在表的数据库
先删除表 drop table sougou_100110;
drop database sougou_test;
或者加上cascade 删除数据库的时候直接删除里边的表;
drop database sougou_test cascade;

在一个数据库中不用切换数据库,就能创建其他数据库中的表 数据库名.表名
指定数据库的存储目录 create database t1 location 'hdfs上的路径';
指定的数据库或表的存储目录location 'hdfs上的目录';
不指定会保存在默认的位置 /user/hive/warehouse


hive中数据分析流程:
1.先有数据
2.数据清洗,变成特定的格式
3.建表,表的结构与数据的格式相同
4.数据装载到表中




在一个数据库中查看另一个数据库的表
show tables in 数据库名

管理表(内部表,临时表)存储在hdfs上
hive会控制着这种表的生命周期
默认情况下会保存在默认的路径下(hdfs上)
删除一个表/数据库 会删除表/数据库 的元数据和表的内容
元数据存储在mysql上
管理表不方便与其他工作共享数据,共享数据是hive不应该拥有管理的权限





外部表:(实际开发中外部表使用的比较多)当一份数据需要被多个工具分析,如PIG,HIVE,意味着数据的所有权并不属于HIVE。
多个应用共同分析使用数据的时候创建成外部表
创建外部表:
create external table id(......)localtion 在hdfs上的存储目录;
external指明表是外部表
localtion 指明数据在hdfs上的存储路径
删除:与内部表不同hive只能访问数据和分析数据 没有删除和管理表的权限 删除表的时候只能删除表的元数据信息
必须指明表的存储路径。
内部表和外部表不可以通过是否存储在hive默认的数据仓库目录来区分。


数据采集--->汇聚,清洗--->存储


分区表:(hive中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash分区、混合分区等)。分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说在表的数据文件中实际上并不保存分区列的信息与数据。
HIVE分区表对表水平切分,将数据按照某种规则进行存储,分区表对没有分区的表有明显的性能优势,实际的生产环境中,分区表使用十分的普遍。
增加分区:
alter table test add partition(part1=”part1”,part2=”part2”) location '/user/test/part1/part2';
修改分区:(修改分区的路径)
alter table test add partition(part1=”part1”,part2=”part2”) set location '/...';
删除分区:
alter table test drop partition(part1=”part1”,part2=”part2”);
动态分区表:
设置动态分区开关:set hive.exec.dynamic.partition=true;
严格模式:
set hive.exec.dynamiic.partition.mode=stric;
默认为strict,对于分区表,若插入语句没有指定至少一个静态分区字段,则执行失败
因为分区列的值要转化为文件夹的存储路径,所以如果分区列的值中包含特殊值,如 '%', ':', '/', '#',它将会被使用%加上2字节的ASCII码进行转义
可以同时向多个分区插入数据,0.7版本以后不存在的分区会自动创建,0.6之前的版本官方文档上说必须要预先创建好分区




装载数据:load data local inpath '本地路径' overwrite into table 表名;
overwrite into 覆盖数据 into直接装载数据
将数据装载到特定的分区里
load data local inpath '本地路径' overwrite into table 表名.partition(clas="1001");
使用local关键字,会将本地文件上传一份到HDFS目录,如果不使用,则将HDFS上的数据移动到指定的目录中
通过查询语句向表中插入数据
insert overwrite table sogou.sogou500w select * from sogou.sogou_20111230;
通过查询语句向分区表中插入数据
创建分区表
CREATE table tb3 (age int, name string) partitioned by (clas string);
向表中插入数据
insert overwrite table tb3 partition(clas=”0610”) select * from tb2 ;
通过ctas向表中插入数据(创建表和插入数据同时进行)
create table sogou.sogou500w as select * from sogou.sogou_20111230;
导出数据
hadoop fs –cp /sogou/20111230 /
hadoop fs -get /user/hive/warehouse/sogou.db/sogou_20111230_uid/000000_0





修改表:
修改列信息:
alter table test change column id uid int comment '...' after name;
对id字段重命名,修改数据类型,注释,在表中前后位置。
增加列:
ALTER TABLE log_messages ADD COLUMNS ( app_name STRING ,
COMMENT ' Application name ' ,
session_id LONG COMMENT ' The current session id') ;
删除或者替换列:
alter table test replace columns(col1 int, col2 string);
删除test表所有字段,并重新定义了字段,只是修改了表的元数据,表数据并不会丢失或者改变
alter table只是修改了表的元数据,一定要保证表的数据与修改后的元数据模式匹配,否则数据将变得不可用










0 0