HIVE的表操作语句

altertablemcs_ugcchangecountcountstring;

altertabletest_col_changeaddcolumns(dint);

http://www.lvcy.net/?post=79

hive>select*fromt_result_channel_user_stat_test;

OK

1000allall2014-07-21116130112627105NULL2014-07-21

1000all02014-07-2111466798022982NULL2014-07-21

1000tjall2014-07-215791021222304NULL2014-07-21

1000all12014-07-21146224604123NULL2014-07-21

1000tj02014-07-215657251097604NULL2014-07-21

1000tj12014-07-2113377124700NULL2014-07-21

hive>describet_result_channel_user_stat_test;

OK

appidintNone

channelidstringNone

usertypestringNone

statdatestringNone

uvstringNone

pvstringNone

ipstringNone

datecolstringNone

#PartitionInformation

#col_namedata_typecomment

datecolstringNone

Timetaken:0.064seconds,Fetched:13row(s)

---------------------------------------------------

转自:http://hi.baidu.com/zhangxinandala/item/49752510cc7ad08789a95617

1.创建表的语句:

Create[EXTERNAL]TABLE[IFNOTEXISTS]table_name

[(col_namedata_type[COMMENTcol_comment],...)]

[COMMENTtable_comment]

[PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],...)]

[CLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]

[ROWFORMATrow_format]

[STOREDASfile_format]

[LOCATIONhdfs_path]

CREATETABLE创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用IFNOTEXIST选项来忽略这个异常。

EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

如果文件数据是纯文本,可以使用STOREDASTEXTFILE。如果数据需要压缩,使用STOREDASSEQUENCE。

有分区的表可以在创建的时候使用PARTITIONEDBY语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行CLUSTEREDBY操作,将若干个列放入一个桶(bucket)中。也可以利用SORTBY对数据进行排序。这样可以为特定应用提高性能。

创建普通的表:

createtabletest_table(

idint,

namestring,

noint)

rowformatdelimited

fieldsterminatedby','

storedastextfile;//指定了字段的分隔符,hive只支持单个字符的分隔符。hive默认的分隔符是\001

创建带有partition的表:

createtabletest_partition(

idint,

namestring,

noint)

partitionedby(dtstring)

rowformatdelimited

fieldsterminatedby','

storedastextfile;

loaddatalocalinpath'/home/zhangxin/hive/test_hive.txt'overwriteintotabletest_partitionpartition(dt='2012-03-05');

创建带有Bucket的表:

createtabletest_bucket(

idint,

namestring,

noint)

partitionedby(dtstring)

clusteredby(id)into10buckets--将id这一列分到10个桶中。

rowformatdelimited

fieldsterminatedby','

storedastextfile;

关于分桶:对列进行分桶,本质上,在进行reduce的时候,会对列的值进行hash,然后将hash的值放到特定的桶中(有点像distributeby)。

注意在写入分桶数据的时候,需要指定:

sethive.enforce.bucketing=true;

更多关于bucketedtable的信息,见:

http://hive.apache.org/docs/r0.8.1/language_manual/working_with_bucketed_tables.html

创建external表:

createexternaltabletest_external(

idint,

namestring,

noint)

rowformatdelimited

fieldsterminatedby','

location'/home/zhangxin/hive/test_hive.txt';

创建与已知表相同结构的表Like:

只复制表的结构,而不复制表的内容。

createtabletest_like_tableliketest_bucket;

2.删除表:

DropTabletablename;

删除一个内部表的同时会同时删除表的元数据和数据。删除一个外部表,只删除元数据而保留数据。

3.修改已经存在的表:

altertable

Altertable语句允许用户改变现有表的结构。用户可以增加列/分区,表本身重命名。

1)增加分区AddPartitions:

ALTERTABLEtable_nameADDpartition_spec[LOCATION'location1']partition_spec[LOCATION'location2']

其中partition_spec的格式为:PARTITION(partition_col=partition_col_value,partition_col=partiton_col_value,...)

用户可以用ALTERTABLEADDPARTITION来向一个表中增加分区。当分区名是字符串时加引号。

altertabletest_partitionaddpartition(dt='2012-03-06')location'/home/zhangxin/hive/test_hive.txt';

2)删除分区dropPartition:

ALTERTABLEtable_nameDROPpartition_spec,partition_spec,...

用户可以用ALTERTABLEDROPPARTITION来删除分区。分区的元数据和数据将被一并删除。

altertabletest_partitiondroppartition(dt='2012-03-06')

3)对表进行重命名renameto:

ALTERTABLEtable_nameRENAMETOnew_table_name

这个命令可以让用户为表更名。数据所在的位置和分区名并不改变。换而言之,老的表名并未“释放”,对老表的更改会改变新表的数据。

altertabletest_partitionrenametonew_test_partition;

4)对表中的某一列进行修改,包括列的名称/列的数据类型/列的位置/列的注释

ALTERTABLEtable_nameCHANGE[COLUMN]col_old_namecol_new_namecolumn_type[COMMENTcol_comment][FIRST|AFTERcolumn_name]

这个命令可以允许用户修改一个列的名称、数据类型、注释或者位置

createtabletest_col_change(aint,bint,cint);

修改列的名称,后面一定要加上数据类型:

ALTERTABLEtest_col_changeCHANGEaa1INT;将a列的名字改为a1.

ALTERTABLEtest_col_changeCHANGEaa1STRINGAFTERb;将a列的名字改为a1,a列的数据类型改为string,并将它放置在列b之后。新的表结构为:bint,a1string,cint.

ALTERTABLEtest_col_changeCHANGEbb1INTFIRST;会将b列的名字修改为b1,并将它放在第一列。新表的结构为:b1int,astring,cint.

注意:对列的改变只会修改Hive的元数据,而不会改变实际数据。用户应该确定保证元数据定义和实际数据结构的一致性。

5)添加/替换列Add/ReplaceColumns

ALTERTABLEtable_nameADD|REPLACECOLUMNS(col_namedata_type[COMMENTcol_comment],...)

ADDCOLUMNS允许用户在当前列的末尾增加新的列,但是在分区列之前。

altertabletest_col_changeaddcolumns(dint);

describetest_col_change;

OK

a1int

b1string

cint

dint

REPLACECOLUMNS删除以后的列,加入新的列。只有在使用native的SerDE(DynamicSerDeorMetadataTypeColumnsetSerDe)的时候才可以这么做。

altertabletest_col_changereplacecolumns(cint);

describetest_col_change;

OK

cint

6)修改表的属性AlterTableProperties:

ALTERTABLEtable_nameSETTBLPROPERTIEStable_properties

table_properties::(property_name=property_value,property_name=property_value,...)

用户可以用这个命令向表中增加metadata,目前last_modified_user,last_modified_time属性都是由Hive自动管理的。用户可以向列表中增加自己的属性。可以使用DESCRIBEEXTENDEDTABLE来获得这些信息。

altertabletest_col_changesettblproperties('key1'='value1');

可以通过describeextendedtest_col_change;查看表的属性信息。

7)修改表的序列化和反序列化属性:

ALTERTABLEtable_nameSETSERDEserde_class_name[WITHSERDEPROPERTIESserde_properties]

ALTERTABLEtable_nameSETSERDEPROPERTIESserde_properties

serde_properties::(property_name=property_value,property_name=property_value,...)

这个命令允许用户向SerDe对象增加用户定义的元数据。Hive为了序列化和反序列化数据,将会初始化SerDe属性,并将属性传给表的SerDe。如此,用户可以为自定义的SerDe存储属性。

8)修改表的文件存储格式组织方式:

ALTERTABLEtable_nameSETFILEFORMATfile_format

ALTERTABLEtable_nameCLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name,...)]INTOnum_bucketsBUCKETS

这个命令修改了表的物理存储属性。

4.将数据加载到表中:

LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]

当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制/移动至Hive表对应的位置。

filepath可以是:

相对路径,例如:project/data1

绝对路径,例如:/user/hive/project/data1

包含模式的完整URI,例如:hdfs://namenode:9000/user/hive/project/data1

加载的目标可以是一个表或者分区。如果表包含分区,必须指定每一个分区的分区名。

filepath可以引用一个文件(这种情况下,Hive会将文件移动到表所对应的目录中)或者是一个目录(在这种情况下,Hive会将目录中的所有文件移动至表所对应的目录中)。

如果指定了LOCAL,那么:load命令会去查找本地文件系统中的filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的URI,比如:file:///user/hive/project/data1.load命令会将filepath中的文件复制到目标文件系统中。

目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置。如果没有指定LOCAL关键字,如果filepath指向的是一个完整的URI,hive会直接使用这个URI。否则:如果没有指定schema或者authority,Hive会使用在hadoop配置文件中定义的schema和authority,fs.default.name指定了Namenode的URI。如果路径不是绝对的,Hive相对于/user/进行解释。Hive会将filepath中指定的文件内容移动到table(或者partition)所指定的路径中。如果使用了OVERWRITE关键字,则目标表(或者分区)中的内容(如果有)会被删除,然后再将filepath指向的文件/目录中的内容添加到表/分区中。如果目标表(分区)已经有一个文件,并且文件名和filepath中的文件名冲突,那么现有的文件会被新文件所替代。

相关推荐