创建表:
create table tableName(time INT,userid BIGINT,url STRING,ip STRING COMMENT 'IP Address of the User') COMMENT 'This is the tableName table' PARTITIONED BY (dt STRING,country String) CLUSTERED BY(userid) SORTED BY(time) INTO 32 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY '001' MAP KEYS TERMINATED BY '\003' STORED as SEQUENCEFILE;
按照userid进行分区划分到不同的桶中,并按照time值的大小进行排序存储。这样的组织结构允许通过userid属性高效地对集群列进行采样。
删除表:
drop table tableName;
修改表、分区语句:
alter table tableName add partition_spec [LOCATION 'location1'] partition_spec [LOCATION 'location2']...
用户可以用alter table add partition来对表增加分区。当分区名字是字符串时加引号,比如对上述建表语句中:
alter table tableName add partition(dt='2010-08-08',country='us') location '/path/to/us/part080808' parition(dt='2010-08-09',country='us') location '/path/to/us/part080809';
删除分区:
alter table tableName drop partition(dt='2010-08-08'),country='us');
将会删除分区,分区的元数据和数据将被一并删除。
重建表名:
alter table tableName rename to newtableName
可以更换表名,数据所在的位置和分区名并不改变。这里老的表名并未被释放,对老表进行修改会改变新表的数据。
改变列名字/类型/位置/注释:
alter table tableName change [column] col_old_name col_new_name column_type [comment col_comment] [FIRST| after column_name]
数据操作(DML)
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] into table tableName [partition(partcl1 = val1....]
其中filepath可以是相对路径也可以是绝对路径,或者是filepath可以是完整的URL(例如:hdfs://namenodeIP:9000/user/admin/project/data1).加载的目标可以是一个表或分区,如果表包含分区则必须制定每个分区的分区名。
JOIN操作
当使用写有Join操作的查询语句时,有一条原则,应该将条目少的表/子查询放在join操作符的左边,原因是这样可以有效减少发生内存溢出的几率
GROUP BY操作
1、map端部分聚合,并不是所有的数据聚合操作都要在reduce端进行聚合,这里需要修改参数为:hive.map.aggr = true,用于是否在map端进行聚合。默认为true. hive.groupby.mapaggr.checkinterval = 100000,用于设定在map端进行聚合的条目数。
2、数据倾斜时进行负载均衡。需要设定hive.groupby.skewindata,当选项为true时,生成的查询计划会有两个mapreduce任务。在第一个mapreduce中,map的输出结果集合会随机分不到reduce中,每个reduce做部分聚合操作,并输出结果。这样处理的结果是,相同的group by key 有可能被分发到不同的reduce中,从而达到负载均衡的作用。第二个MapReduce任务再根据预处理的数据结果按照Group By Key分布到reduce中(这个过程可以保证相同的Group By Key 分布到同一个Reduce中),最后完成最终的聚合操作。
3、合并小文件