Hive表和存储结构《三》

来源:互联网 发布:淘宝账号如何实名认证 编辑:程序博客网 时间:2024/05/17 11:05
1.注意的几个地方
(1)dfs.permissions   设为false,否则容易报权限问题。 
(2)mysql> alter database hive character set latin1;

否则容易报错:

FAILED: Error in metadata: MetaException(message:Got exception: org.apache.thrift.transport.TTransportException null)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

2.Hive存储路径设置

必须创建 /tmp 和 /user/hive/warehouse,而且相对于HDFS,赋予g+w权限
hadoop fs -mkdir       /tmp     
hadoop fs -mkdir       /user/hive/warehouse
hadoop fs -chmod  g+w   /tmp
hadoop fs -chmod  g+w   /user/hive/warehouse

默认存储路径
<property>
  <name>hive.metastore.warehouse.dir</name>
  <value>/user/hive/warehouse</value>
  <description>location of default database for the arehouse</description>
</property>

3.Hive

hive的表分为两种:
内部表(托管表
外部表(external )//比较常用

默认分隔符:列 为 \001         行为 \n

(1)创建表
create table page_views(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

//这就创建了一个hive的表,有track_time,url ,session_id ,referer ,ip ,end_user_id ,city_id 这些字段,并且指定每行的数据之间的分隔符是\t

hive -e "load data local inpath '/home/hadoop/page_views.dat'  OVERWRITE INTO TABLE  page_views;"
//Load    可以load本地文件和hdfs文件
   注意在load的时候如果要导入的数据的分隔符和表所指定的分割符不同的时候,会默认load到表的第一个字段中。
   OVERWRITE是覆盖掉原来的数据重新添加,如果不加OVERWRITE就是在原数据的末尾进行追加。
(2)创建分区的表
一般增量表都会建成分区表,维度表会创建成一般的表。
create table page_views(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
partitioned by(dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
//这就创建了一个hive的带有分区的表,分区的标示是dt字段(string类型)

hive -e "load data local inpath '/home/hadoop/page_views.dat'  OVERWRITE INTO TABLE  page_views partition (dt='2014-7-27');"
hive -e "load data local inpath '/home/hadoop/page_views.dat'  OVERWRITE INTO TABLE  page_views partition (dt='2014-7-28');"
//这样就把数据导入到了page_views表中。并指定分区为'2014-7-27','2014-7-28',在hdfs的文件系统中,在/user/hive/warehouse会生成page_views文件夹,在page_views下又会生成dt=2014-7-27,dt=2014-7-28这两个文件夹,在这两个文件夹的下面才实际存储了数据的文件。


可以根据分区来进行查询
select * from page_views where dt='2014-7-27' limit 10; (这条语句并不会解析成mappreduce的任务)

(3)创建二级分区的表

create table page_views(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
partitioned by(dt string,step int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
//这样就创建 了一个二级分区的表,分区的标示是dt(string)和step(int)

hive -e "load data local inpath '/home/hadoop/page_views.dat'  OVERWRITE INTO TABLE  page_views partition (dt='2014-7-27',step=1);"
hive -e "load data local inpath '/home/hadoop/page_views.dat'  OVERWRITE INTO TABLE  page_views partition (dt='2014-7-27',step=2);"
//注意这时候一定要指定二级的分区(dt='2014-7-27',step=1),如果只是指定一个分区就会报错。


这样在HDFS文件系统中/user/hive/warehouse会生成page_views文件夹,在page_views下又会生成dt=2014-7-27,在dt=2014-7-27下又会生成名为step=1和step=2的两个文件夹,在这两个文件夹的下面才实际存储了数据的文件。

(4)创建表时指定存储的路径

在创建的表的时候默认的存储的路径是/user/hive/warehouse,当然在创建表的时候可以指定存储的路径。

首先创建所要指定的路径,
hadoop fs -mkdir /user/share
Hadoop fs -chmod 777 /user/share

create table page_views(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) partitioned by(dt string,step int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location ' /user/share/page_views';

4.其他的一些命令

hive -e //后面可以执行一段sql语句。
hive -f  //后面可以执行一个sql文件
hive -s //以简洁的方式进入shell模式,打印的信息偶比较简洁
hive -v  //以这种模式进入shell,打印的信息比较的详细。
0 0
原创粉丝点击