linux统计hive建表语句,2、Hive的建表操作

一、hive支持的数据类型

1、数字型

3b9a4b1bc351d40a21fdacc83be2e970.png

2、日期型

6d2261f3bdf2a61f94f3f61f9fb4436e.png

1、Timestamps

支持传统的UNIX时间戳和可选的纳秒精度。

支持的转化:

整数数字类型:以秒为单位解释为UNIX时间戳

浮点数值类型:以秒为单位解释为UNIX时间戳,带小数精度

字符串:符合JDBC java.sql.Timestamp格式“YYYY-MM-DD HH:MM:SS.fffffffff”(9位小数位精度)

时间戳被解释为无时间的,并被存储为从Unix纪元的偏移量。 提供了用于转换到和从时区转换的便捷UDFs(to_utc_timestamp,from_utc_timestamp)。

所有现有的日期时间UDFs(月,日,年,小时等)都使用TIMESTAMP数据类型。 Text files中的时间戳必须使用格式yyyy-mm-dd hh:mm:ss [.f …]。 如果它们是另一种格式,请将它们声明为适当的类型(INT,FLOAT,STRING等),并使用UDF将它们转换为时间戳。

在表级别上,可以通过向SerDe属性”timestamp.formats”(自版本1.2.0 with HIVE-9298)提供格式来支持备选时间戳格式。 例如,yyyy-MM-dd’T’HH:mm:ss.SSS,yyyy-MM-dd’T’HH:mm:ss。

2、Dates

DATE值描述特定的年/月/日,格式为YYYY-MM-DD。 例如,DATE’2013-01-01’。 日期类型没有时间组件。 Date类型支持的值范围是0000-01-01到9999-12-31,这取决于Java Date类型的原始支持。

Date types只能在Date, Timestamp, or String types之间转换。

b3b3fe48c46b5bb13c4ac6cf371fe983.png

3、字符型

8e1ae29f09a392f64e736dbf2bd79500.png

4、复杂类型

d033f825efa5502dc7956aab2f7a2a94.png

二:建表操作

1、建表语句

create [external] table if not exists default.order_phone (

phone_nameSTRINGCOMMENT '手机名称',

phone_companySTRINGCOMMENT '手机厂商',

company_addrSTRINGCOMMENT '厂商地址',

exchange_numINTCOMMENT '成交数量',

phone_priceFLOATCOMMENT '手机单价',

total_priceDOUBLECOMMENT '总交易价钱',

order_timeTIMESTAMPCOMMENT '创建时间戳'

) partitioned by (order_time_p STRING)stored as parquet;

hive 支持的table 格式:RCFILE,PARQUET,TEXTFILE,SEQUENCEFILE

2、内部表和外部表的区别

1、内部表 : 表目录会创建在hdfs的/user/hive/warehouse/的相应库目录中

2、外部表 : 外部表会根据建表时Location关键字指定的路径创建表目录(如果没有指定LOCATION,则位置与内部表相同)

内部表的创建和外部表的创建,就差两个关键字: external location

举例:

内部表 —— create table t_inner(ID INT);

外部表 —— create [external] table t_external(ID INT) location '/AA/BB/XX';

HIVE中建表语句所做的两件事情:

1、创建HDFS上相应表目录

2、在元数据库中创建相应表的描述数据(元数据)

内部表和外部表在drop时有不同的特性:

1、 drop时,元数据都会被清除

2、 drop时,内部表的表数据目录会被删除,但是外部表的表数据目录不会被删除

所以: 整个数据仓库的最底层的表(与仓库外的数据对接的表,ODS层)

3、分区表:PARTITIONED BY (year string, moth string)

1、 可以将用户的整个表数据在存储时划分到多个子目录中(子目录以分区变量的值来命名),特别是有的信息是需要按照年份来进行分类存储的。 create table t_a(name string) partitioned by (year string) store as parquet; (一级分区)

create table t_b(name string) partitioned by (year string,moth string) store as parquet; 二级分区

2、分区表的数据导入方式 load data local inpath '/test.txt' into table t_f partition(year='2014',daystr='0929');

表中会多出一个字段(就是这个分区字段。),在查询的时候,直接可以用于where +--------------------------+-----------------------+-----------------------+--+

| col_name | data_type | comment |

+--------------------------+-----------------------+-----------------------+--+

| id | int | |

| name | string | |

| age | int | |

| year | string | |

| | NULL | NULL |

| # Partition Information | NULL | NULL |

| # col_name | data_type | comment |

| | NULL | NULL |

| year | string | |

+--------------------------+-----------------------+-----------------------+--+

3、 分区表的意义

可以让用户在做数据统计时缩小数据扫描的范围,因为可以在select时指定要统计的分区 select count(*) from t_f where year='2014';

4、分桶表 CLUSTERED BY (col_name, col_name, ...)

将suffle之后每个reduce的结果保存起来。每个reduce的结果可以能是小明、小强。。。等人的数据集合(他们是hash % reducer数相同)。而且每个人都可能有多条相关的数据在里面,比如他们的上网流量。 区别于group by。group by结果一定是一个组一条数据,比如统计用户平均流量。得到的结果每个人肯定只有一条数据。

[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

1、 语法示例 drop table stu_buck;

create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)

clustered by(Sno)

sorted by(Sno DESC)

into 4 buckets

row format delimited fields terminated by ',';

2、分桶表的意义

为了保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)分桶表数据进行抽样和JOIN时可以提高MR程序效率

3、分桶表的使用

首先创建一个带分桶定义的表(分桶表)然后从原始数据(普通表)中用分桶查询得到分桶数据插入到分桶表中 例:

3.1、创建普通表 drop table t_stu;

create table t_stu(Sno int,Sname string,Sex string,Sage int,Sdept string)

row format delimited fields terminated by ',';

3.2、导入原始数据到普通表 load data local inpath '/root/hivedata/students.txt' into table t_stu;

3.4、创建分桶表 create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)

clustered by(Sno)

sorted by(Sno DESC)

into 4 buckets

row format delimited fields terminated by ',';

3.5、使用分桶查询,并将结果insert到分桶表中 首先将分桶查询开关开启:

hive> set hive.enforce.bucketing = true;

注意:粪桶表中定义了多少个桶,那么在查询时就必须制定分成多少个桶,如何制定呢?

hive> set mapreduce.job.reduces=4;

然后,查询(distribute : 根据这个列来散开)

insert into table stu_buck SELECT * FROM T_STU distribute BY (SNO) SORT BY (sno DESC);

或者:直接使用一个clustered ,将上面两个都包含了,只是没有那么灵活

insert into table stu_buck SELECT * FROM T_STU clustered BY (SNO);

4、分桶查询解析 DISTRIBUTE BY (SNO) -----指定mapreduce程序中getPartition()的依据字段为SNO

SORT BY (sno DESC) ----- 指定mapreduce程序中shuffle排序时所依据的字段及正序和倒序

SELECT * FROM T_STU distribute BY (SNO) SORT BY (sno);

SELECT * FROM T_STU CLUSTER BY (SNO);

上述两句效果相同,但是distribute BY (SNO) SORT BY (sno) 可以将partition字段和排序字段分别指定

三:表修改

1、修改表字段 添加分区 :alter table aaa add partition(year="06"); 前提是这个year是分区字段。

删除分区 :alter table aaa drop partition(year='06');

添加字段 :alter table stu_buck add columns(gender string);

删除字段 :alter table stu_buck drop columns(gender);

修改表名 :alter table aaa rename to hello;

修改字段名和类型:alter table aaa change zd_type zd_type_other string;

修改类型 :alter table aaa change zd_type zd_type string;

2、强制删除非空database drop database tmp cascade;

3、显示命令 show tables;

show databases;

show partitions table_name;

show functions;

desc table_name;

desc extended table_name;

desc formatted table_name;

四、总结:

分区表:主要是为了将文件分类存放。1、先创建分区表,2、在导入文件到自己指定的分区中。

分桶表:主要是用于保存一个表的分桶查询结果。1、先创建一个分桶表分桶表对应需要查询的表,2、对表进行分桶查询。插入分桶表中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值