表操作
创建表
CREATE TABLE IF NOT EXISTS mydb.employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING> COMMENT '下属名称',
deductions MAP<STRING, FLOAT>,
address STRUCT<stree:STRING, city:STRING, state:STRING, zip:INT>)
COMMENT 'Description of the table'
TBLPROPERTIES('creater'='me', 'created_at'='2012-01-02 10:00:00',...)
LOCATION '/user/hive/warehouse/mydb.db/employees';
TBLPROPERTIES:增加了额外的说明文档,以key-value形式保存。Hive会自动增加两个表属性,last_modified_by和last_modified_time。
LOCATION :根据情况为表中数据指定一个路径。默认情况下,放在这个表所属的数据库目录之后,default数据库例外,会直接在warehouse目录下
查看表信息:
可以使用DESCRIBE EXTENDED mydb.employees命令来查看表的详细结构信息。
使用FORMATTED关键字代替EXTENDED 关键字的话,可以提供更加详细的的内容。
管理表和外部表
管理表:也称为内部表。默认情况下配置在配置项,hive.metastore.warehouse.dir目录下。当我们删除一个管理表时,也会删除数据。
外部表:删除表时不会删除数据,只会删除元数据信息,利于分享数据。
用户可以通过DESCRIBE EXTENDED tablename查看是哪种表
... tableType:MANAGED_TABLE) //管理表
... tableType:EXTERNAL_TABLE) //外部表
分区表
先按照国家(country)分区,在更具州(state)分区:
CREATE TABLE IF NOT EXISTS mydb.employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING> COMMENT '下属名称',
deductions MAP<STRING, FLOAT>,
address STRUCT<stree:STRING, city:STRING, state:STRING, zip:INT>)
PARTITIONED BY (country STRING, state STRING);
Hive会自动根据分区创建目录
...
.../employees/country=CA/state=AB
.../employees/country=US/state=AK
...
设置分区的外部表
外部表童谣是可以使用分区,举例:
第一步:讲分区数据拷贝到指定路径,例如下面将分区数据拷贝到S3中
hadoop distcp /data/log_message/2011/12/02 s3n://ourbucket/logs/2011/12/02
第二部:修改表,改变分区路径指向,例如下面指向S3路径:
ALTER TABLE log_message PARTITION(year = 2011, month = 12, data =2)
SET LOCATION 's3n://ourbucket/logs/2011/12/02';
第三部:使用hadoop fs -rmr命令删除掉HDFS中的这个分区数据:
hadoop fs -rmr /data/log_messages/2011/01/02
修改表分区
修改表分区的操作都不会使得数据本生发生变动,只会改变元数据信息。
增加:
ALTER TABLE log_message ADD IF NOT EXISTS
PARTITION (year = 2011, month = 1, day = 1) LOCATION '/logs/2011/01/01'
PARTITION (year = 2011, month = 1, day = 2) LOCATION '/lo