基本命令
切换数据库: use <db_name>;
表重命名:ALTER TABLE table1 RENAME TO table2;
增加表分区
ALTER TABLE table1 ADD IF NOT EXISTS
PARTITION (year = 2001)
PARTITION (year = 2002)
...;
删除表分区
ALTER TABLE table1 DROP IF EXISTS PARTITION (year = 2001);
重命名列名
ALTER TABLE table1 CHANGE COLUMN <old_col> <new_col>
插入新列
ALTER TABLE table1 ADD COLUMNS(
app_name STRING
session_id LONG);
改变存储格式
ALTER TABLE table1
[PATITION (year = 2001)]
SET FILEFORMAT SEQUENCEFILE;
本地导入数据
LOAD DATA LOCAL INPATH '${env: HOME}/ California/employees'
OVERWRITE INTO TABLE employees
[PARTITION (country = 'US')];
通过查询语句插入数据
INSERT OVERWRITE TABLE employees
[PARTITION(...)]
SELECT * FROM stage_employees se
WHERE se.cnty = 'US' and se.et = 'OR';
通过单个查询语句创建表
CREATE TABLE table1
AS SELECT name, salary, address
FROM employees es
WHERE es.cnty = 'US';
导出数据
INSERT OVERWRITE DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees es
WHERE es.cnty = 'US'
Hive 查询
SELECT col1, col2, col3 FROM table1 WHERE ...
可以增加一些数学运算符 或者 自带函数
聚合函数
SELECT count(*), avg(salary)
FROM employees
GROUP BY cnty;
LIMIT: LIMIT从句用于限制结果的行数
设置列别名
SELECT count(*) as sum_num , avg(salary) as avg_sal
FROM employees
GROUP BY cnty;
LIKE: 与通配符 % 一起用, %可代替任何内容
HAVING: HAVING从句用来限制 GROUP BY产生的结果的输出。
SELECT avg(salary)
FROM employees
GROUP BY cnty
HAVING avg(salary) > 500;
JOIN
Hive SQL支持JOIN操作,但是只支持等值连接。
inner join
SELECT a.ymd, a.price, b.price
FROM stocks a inner join stocks b on a.ymd = b.ymd
WHERE a.name = "IBM" and b.name = "APPLE"
理论上一个JOIN 需要启动一个mapreduce任务,但是当多个表做连接时ON子句的连接键一样的话只启用一个mapreduce任务。
JOIN优化,把大表放在最后 或者 在代码中加入/*+STREAMTABLE(小表)*/
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
LEFT SEMI-JOIN
左半边连接 只返回左表中满足on条件的结果。
map-side join
在JOIN时,把小表加载到内存中能够加快JOIN效率。
SORT BY、ODER BY 、DISTRIBUTE BY 、CLUSTER BY
ODER BY 对数据做全局排序,最后用一个reduce做排序
SORT BY 对数据做局部排序,在每一个reduce中排序
DISTRIBUTE BY控制map的输出在reduce中是如何划分的。
CLUSTER BY 相当于结合DISTRIBUTE BY 和 SORT BY,对同一列做DISTRIBUTE 和 SORT,但是只支持默认的升序排列。
数值转化
CAST( VALUE AS TYPE)