Hive-SQL学习笔记

HIVE-SQL

  • DDL(Data Defination Language)
  • DML(Data manipulation language)
  • DQL(data query language)

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据表,并提供类似于SQL(HiveSQL)的操作功能。在Hive中,本质上是将SQL转换成为MapReduce程序

Hive的基本操作与传统的数据库的操作类似,所不同的是Hive的SQL语句会转换成MapReduce程序执行,对于特定的查询等操作,具有更高的性能。使用的前提是假设已经搭建好Hive以及Hadoop集群基本上。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业。

DDL(Data Defination Language)


CREATE DARABASE name;

显示查看操作命令
show tables; --显示表

show databases; --显示数据库

show partitions table_name; --显示表名为table_name的表的所有分区

show functions ; --显示所有函数

describe extended table_name col_name; --查看表中字段

数据库定义语言
创建表结构

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 invites (foo INT, bar STRING) PARTITIONED BY (dindex STRING);

显示所有表:

SHOW TABLES;

按正则表达式显示表:

SHOW TABLES '.*s';

表中添加一个字段:

ALTER TABLE pokes ADD COLUMNS (new_col INT);

添加一个字段并为其添加注释:

ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

删除列:

ALTER TABLE test REPLACE COLUMNS(id BIGINT, name STRING);

更改表名:

ALTER TABLE events RENAME TO new_events;

DML(Data manipulation language)

数据操作语言,主要是数据库增删改三种操作,DML包括:INSERT插入、UPDATE新、DELETE删除。

向数据表内加载文件:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

–load操作只是单纯的复制/移动操作,将数据文件移动到Hive表对应的位置。

–加载本地

LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

–加载HDFS数据,同时给定分区信息

LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

将查询结果插入到HDFS文件系统中

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...

FROM from_statement

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1

[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]

DQL(data query language)

SELECT查询结构:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list [HAVING condition]]

[ CLUSTER BY col_list

| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]

]
[LIMIT number]
  • 使用ALL和DISTINCT选项区分对重复记录的处理。默认是ALL,表示查询所有记录DISTINCT表示去掉重复的记录 Where 条件
  • 类似我们传统SQL的where 条件 ORDER BY 全局排序,只有一个Reduce任务 SORT BY 只在本机做排序 LIMIT限制输出的个数和输出起始位置

将查询数据输出至目录:

INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='';

将查询结果输出至本地目录:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes 

Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。Hive 不支持所有非等值的连接,因为非等值连接非常难转化到 map/reduce 任务。

  • LEFT,RIGHT和FULL OUTER关键字用于处理join中空记录的情况
  • LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现join 时,每次 map/reduce 任务的逻辑是这样的:reducer 会缓存 join序列中除了最后一个表的所有表的记录,再过最后一个表将结果序列化到文件系统,实际应用过程中应尽量使用小表join大表

join查询时应注意的点:

–只支持等值连接

SELECT a.* FROM a JOIN b ON (a.id = b.id)

SELECT a.* FROM a JOIN b ON (a.id = b.id AND a.department = b.department)

–可以 join 多个表

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

–如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务

LEFT,RIGHT和FULL OUTER关键字

--左外连接

SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)

--右外链接

SELECT a.val, b.val FROM a RIGHT OUTER JOIN b ON (a.key=b.key)

--满外连接

SELECT a.val, b.val FROM a FULL OUTER JOIN b ON (a.key=b.key)

UNION 与 UNION ALL

--用来合并多个select的查询结果,需要保证select中字段须一致

select_statement UNION ALL select_statement UNION ALL select_statement ...

--UNION 和 UNION ALL的区别

--UNION只会查询到两个表中不同的数据,相同的部分不会被查出

--UNION ALL会把两个表的所有数据都查询出

你可能感兴趣的:(数据库相关,大数据相关,hive,大数据,数据库)