Hive笔记(查询和建表)

1、数据类型和文件格式

数据类型

创建表时需要指定字段的数据类型,hive支持一些集合数据类型,STRUCT、MAP和ARRAY:

  • STRUCT:STRUCT < first:INT, second:STRING >
    struct(5, ‘jack’)
    通过字段名.first 和 字段名.second访问内容
  • MAP:MAP < STRING, FLOAT >
    map(‘first’, 5.2)
    通过字段名[‘first’]获取数据
  • ARRAY:ARRAY < STRING>
    ARRAY(‘jack’, ‘rose’)
    通过字段名[0]来访问

建表例子:

CREATE TABLE employees(
name        STRING,
salary      FLOAT,
subordinate ARRAY<STRING>,
deductions  MAP<STRING, FLOAT>,
addres      STRCUT<street:STRING, city:STRING, STATE:STRING>
);

文件格式

分隔符:

  • \n : 换行符
  • ^A:用于分割字段(列),在create table 中可以使用8进制的编码\001
  • ^B:用于分割ARRAY或者STRUCT中的元素,或MAP中键值对的分割,8进制\002
  • ^C:用于MAP中键和值得分割,8进制\003
CREATE TABLE employees(
name        STRING,
salary      FLOAT,
subordinate ARRAY<STRING>,
deductions  MAP<STRING, FLOAT>,
addres      STRCUT<street:STRING, city:STRING, STATE:STRING>
)
ROW FORMAT DELIMITED
# 必须写在其他子句之前
FIELDS TERMINATED BY '\001'
# 指定^A作为字段(列)的分割符
COLLECTION ITEMS TERMINATED BY '\002'
# 指定^B作为集合元素的分隔符
MAP KEYS TERMINATED BY '\003'
# 指定^C为键值对的分隔符
LINES TERMINATED BY '\n'
# 指定换行符,目前只能用\n
STORED AS TEXTFILE;
# 指定存储格式
;

2、数据库和表的操作

2.1 数据库中的常用操作

  • SHOW DATABASES:展示所有的数据库,想筛选可以用LIKE ‘H.*’用正则表达式
  • CREATE DATABASE financials:创建数据库
  • DESCRIBE DATABASE financials:查看数据库位置
  • USE:指定某个数据库为当前工作数据库
  • DROP DATABASE IF EXISTS financials:删除数据库
  • SHOW PARTITIONS financials:查看表中存在的所有分区
  • DESCRIBE EXTENED employees:显示分区键

2.2 创建表

管理表、外部表和分区表

管理表和外部表的区别:
管理表将数据移动到数据仓库指向的路径,仅记录数据所在的路径,不对数据的位置做任何改变。外部表将数据存放到指定目录中。Hive删除表时,管理表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
管理表和外部表的使用场景:
①外部表:比如某个公司的原始日志数据存放在一个目录中,多个部门对这些原始数据进行分析,那么创建外部表是明智选择,这样原始数据不会被删除;
②管理表:对原始数据或比较重要的中间数据进行建表存储;
③分区表:将每个小时或每天的日志文件进行分区存储,可以针对某个特定时间段做业务分析,而不必分析扫描所有数据;

创建代码

CREATE TABLE IF NOT EXISTS 表名(...)
# 创建管理表
CREATE EXTERNAL TABLE IF NOT EXISTS 表名(...)
# 创建外部表
CREATE EXTERNAL TABLE IF NOT EXISTS 表名(...)
PARTITIONED BY (country STRING, state STRING);
# 创建外部分区表

2.3 修改表

通过ALTER关键字对表进行修改

表重命名

ALTER TABLE previous_name RENAME TO new_name

增加、修改、删除表分区

增加分区表:
ALTER TABLE table_name ADD IF NOT EXISTS
PARTITION (year=2011, month=1, day=1) LOCATION ‘/logs/2011/01/01’;
修改分区表,移动位置:
ALTER TABLE table_name PARTITION (year=2011, month=1, day=1)
SET LOCATION ‘/new_logs/2011/01/01’;
删除某个分区:
ALTER TABLE table_name DROP IF EXISTS PARTITION (year=2011, month=1, day=1);

修改列

增加列:
ALTER TABLE tabl_name ADD COLUMNS(
app_ name STRING COMMENT ‘Application name’,
session_di LONG COMMENT ‘the current session id’
);
删除或替换列:
ALTER TABLE table_name REPLACE COLUMNS(
hms INT COMMENT ‘hour, minute, seconds’

)

删除表

DROP TABLE IF EXISTS employees;

2.4 插入数据

2.4.1 本地数据插入

LOAD DATA LOCAL INPATH '/data_path'
OVERWRITE INTO TABLE employees
PARTITION (country='US', state='CA');

OVERWRITE 关键字:会先删除原有数据,在插入新数据,如果想追加插入把OVERWRITE改成INTO,如果存在分区,就直接加入,不存在会先新建这个分区。

2.4.2 通过查询语句向表中插入数据

INSERT OVERWRITE TABLE employees
PARTITION (country='US', state='CA')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';

2.4.3 动态分区插入

动态分区不需要指定分区,由系统自己选择,使用时需要更改两个设置
set hive.exec.dynamic.partition=true;
设置开启动态分区,动态分区在插入数据时可以不指定分区类型,系统自动选择
set hive.exec.dynamic.partition.mode=nonstrict;
动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE employees
PARTITION (country, state)
SELECT ..., se.cty, se.st
FROM staged_employees se;

3、表的查询

3.1 SELECT … FROM

3.1.1 列可选操作:

  • 正则表达式:SELECT ‘price.*’ FROM employees
  • 算术运算:常用:+ - * / %(求余)
  • 数学函数:常用:round(DOUBLE d, INT n) 保留n位小数、sqrt、abs、exp、ln
  • 聚合函数:常用:
    • count(*) 计算总行数包括null行
    • count(列名) 计算列中非null行数
    • sum()、avg、min、max、variance
    • covar_pop(col1, col2):返回协方差
    • corr(col1, col2):返回相关系数
  • 内置函数

3.1.2 其他可选参数

SELECT e.col1 as col1_name FROM employees e LIMIT 10;
as:列别名、LIMIT:限制返回行数

3.1.3 嵌套SELECT语句

SELECT e.name, e.salary FROM 
(SELECT person_id as name, salary FROM employees) e
where 指定条件 and 条件

3.2 WHERE 语句

  • 同上例一样,给select语句限定条件,用and或者or连接条件间的关系。
  • 可以用正则表示帅的。LIKE和RLIKE

3.3 GROUP BY 和 HAVING 语句

where用于筛选原表的内容,group by 对结果进行分组, having对group by结果过滤,顺序是where -> group by -> having

SELECT year(ymd), avg(price_close) FROM stocks
WHERE exchange = 'NASDAQ' AND symbol = 'AAPL'
GROUP BY year(ymd)
HAVING avg(price_close) > 50.0;

3.4 JOIN 语句

JOIN … ON,JOIN连接两个表,ON表示两个表的连接条件

SELECT s.ymd, s.symbol, s.price_close, d.dividend
FROM stocks JOIN dividends d ON s.ymd = d.ymd and s.symbol=d.symbol
WHERE s.symbol = 'AAPL';

INNER JOIN:JOIN默认是INNER JOIN 要两边同时存在才会显示
LEFT OUTER JOIN:左表满足条件则显示,右边填NULL
RIGHT OUTER JOIN:同上
FULL OUTER JOIN:两边都填NULL
JOIN:笛卡尔积

同时有where和join时,是先执行join再执行where,所以如果是outer join,大量数据中有null,可能会被where语句过滤掉

4、一个例子

官方API文档:

https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentation

使用工具:beeline

常用指令:

  • 1、!connect url –连接不同的Hive2服务器
  • 2、!exit –退出shell
  • 3、!help –显示全部命令列表

猜你喜欢

转载自blog.csdn.net/xiayto/article/details/81866751