数据操作
加载数据
LOAD DATA [LOCAL] IMPATH 'path' [OVERWRITE] INTO TABLE tablename [PARTITION (column = x)];
- LOAD DATA 加载数据
- LOCAL 本地数据,不加LOCAL就是分布式文件系统数据
- OVERWRITE表示覆盖表中已有数据,否则表示追加
通过查询语言插入数据
这里使用了OVERWRITE关键字,之前分区内容会被覆盖掉。这是一次插入。
INSERT OVERWRITE INTO TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';
以下为多次插入,对多个分区目录插入数据
FROM staged_employees se
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US',state = 'OR')
SELECT * WHERE se.cnty = 'US' AND se.st = 'OR'
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US',state = 'CA')
SELECT * WHERE se.cnty = 'US' AND se.st = 'CA'
···
动态分区插入,会自动根据字段匹配插入数据,这个减少了代码量。根据国家和州,自动分区插入数据。也可以动态和静态混合使用。动态分区功能默认情况下没有开启。
INSERT OVERWRITE TABLE employees
PARTITION (country,state)
SELECT se.cnty,se.st
FROM staged_employees se;
创建表并加载数据
用AS SELECT关键字
CREATE TABLE ca_employees
AS SELECT name,salary,address
FROM employees se
WHERE se.state = 'CA'
导出数据
- 写出多少个文件取决于调用的reducer个数
- 不管源表数据如何存储,Hive会把所有字段序列化成字符串写入文件
- 没有LOCAL,导入到HDFS系统上
INSERT OVERWRITE [LOCAL] DIRECTORY '/path'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
SELECT name, salary, address
FROM employees se
WHERE se.state = 'CA';
数据查询
查询语句
SELECT [ALL | DISTINCT] column1,column2
FROM tablename
[WHERE condition]
[GROUP BY col]
[ORDER BY col]
[CLUSTER BY col]
[SOTY BY col]
[LIMIT number]
常用函数:count max min sum avg
正则表达式 %任意个 _一个
CASE...WHEN...THEN句式
SELECT name,salary
CASE
WHEN salary <5000 THEN 'low'
WHEN THEN
ELSE
END
FROM employees;
Hive对某些情况的查询不必启动MapReduce,比如简单查询表存储目录下的文件,包括WHERE过滤条件
Hive只支持等值连接。JOIN ON
四种排序的差异:ORDER BY、SORT BY、DISTRIBUTE BY、
- ORDER BY,全局排序
- SORT BY,区内排序,一般和DISTRIBUTE BY一起用。SORT BY是对一个reduce内的数据排序。DISTRIBUTE BY控制map的输出在reducer中如何划分的
- CLUSTER BY,相当于SORT BY和DISTRIBUTE BY一起用
分桶表
分区针对的是数据的存储路径,分桶针对的是数据文件。分桶是将数据集分解成更容易管理的若干部分的一种技术。
创建分桶表
CREATE TABLE tablename(col type)
CLUSTER BY (col)
INTO 4 BUCKETS
//创建分桶表,分成4个桶,有4个文件。
导入数据时,要用MapReduce中的PARTITIONER。这样导入后,目录下有4个文件。
//先设置桶属性
set hive.enforce.bucketing=true;
set mapreduce.job.reduces=-1;//根据桶的个数确定reduce个数,也就是4个。
INSERT INTO TABLE table1
SELECT * FROM table2
抽样查询
对于大数据集,用户需要使用一个具有代表性的查询结果,而不是全部的查询结果,可以通过对表进行抽样来满足这个需求
SELECT * FROM tablename TABLESAMPLE(bucket x out of y on col);
//根据y的大小决定抽样比例
z个桶,(x,y) 抽z/y个桶数据