1.建表语法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
•CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常
•EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
•LIKE 允许用户复制现有的表结构,但是不复制数据
CREATE TABLE empty_key_value_store
LIKE key_value_store;
•COMMENT可以为表与字段增加描述
•ROW FORMAT
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表的具体的列的数据。
例子:
create table student (Snoint,Sname string,Sex string,Sageint,Sdept string)
row format delimited fields terminated by','//声明分隔符
stored as textfile;//声明储存方式
2. 查询学生信息,按性别分区,在分区内按年龄有序
1)select * from student order by sex, sage;
2)set mapred.reduce.tasks=2;
select * from student distribute by sex sort by sage;
distribute by是按照指定的字段对数据进行划分到不同的reduce中
第一的语句,我们只是按照性别和年龄排序
第二个,我们设置了2个reduce,并且按照性别分区。sort by sage;
理解sort by和order by的区别。order by是全局排序。而sort by是每个分区内部排序。
3. 查询学生的姓名、课程名称和分数
select student.sname, course.cname, sc.grade
from student join sc on student.sno= sc.sno
join course on sc.cno=course.cno
join后面跟要连接的表,on后面跟连接的条件。
on和where是不同的
-on指的连接条件
-where是表链接后,再进一步按照where指定条件筛选
网友评论