【Hive】Hive编程指南

第一章 基础知识

Hive

  1. Hive不是一个完整的数据库。Hadoop以及HDFS的设计本身约束和局限性地限制了Hive所能胜任的工作。其中最大的限制就是Hive不支持记录级别的更新、插入或者删除操作。
  2. 同时,因为Hadoop是一个面向批处理的系统,而MapReduce任务(job)的启动过程需要消耗较长的时间,所以Hive延时比较严重
  3. Hive不支持事务。
  4. Hive是最适合数据仓库应用程序的。

MapReduce计算框架

  1. 每次调用时,传递给Mapper的键是文档中这行的起始位置的字符偏移量
  2. Hadoop神奇的地方一部分在与后面要进行的Sort(排序)和Shuffle(重新分发)过程。Hadoop会按照键-值对进行排序,然后“重新洗牌”,将所有的相同的键-值对分发到同一个Reducer中。

第二章 基础操作

安装Hive

$ cd /your/hive/directory/
$ tar -xzf hive-0.9.0.tar.gz
$ sudo echo "export HIVE_HOME=$PWD/hive-0.9.0" > /etc/profile.d/hive.sh
$ sudo echo "PATH=$PATH:$HIVE_HOME/bin" > /etc/profile.d/hive.sh
$ . /etc/profile

配置Hive

  1. 配置目录$HIVE_HOME/conf下的hive-site.xml文件(如不存在则自己创建)。
  2. 使用JDBC连接元数据。
  3. 在实践中,大多数的Hive客户端会使用MySQL。

启动Hive

$ cd $HIVE_HOME
$ bin/hive
...
hive> CREATE TABLE x (a INT);
OK
Time taken: ...
hive> SELECT *
    > FROM x;
OK
Time taken: ...
hive> DROP TABLE x;
OK
Time taken: ...
hive> exit;
$

命令行界面

  1. Hive中“一次使用”命令
  2. 从文件中执行Hive查询
  3. 在Hive内使用Hadoop的dfs命令
  4. ……

第三章 数据类型和文件格式

集合数据类型

数据类型字面语法示例引用
STRUCTstruct(‘Jone’, ‘Doe’)字段名.first
MAPmap(‘first’, ‘Jone’, ‘last’, ‘Doe’)字段名[‘last’]
ARRAYArray(‘Jone’, ‘Doe’)数组名[1]

文本文件数据编码

表结构声明(明确指定分隔符):

CREATE TABLE employees (
    name STRING,
    salary FLOAT,
    subordinates ARRAY<STRING>,
    deductions MAP<STRING, FLOAT>,
    address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
ROW FORMAT DELIMITED
FILEDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

第四章 HiveQL:数据定义

  1. Hive不支持行级插入操作更新操作删除操作
  2. Hive也不支持事务。

4.1 Hive中的数据库

  1. 在所有的数据库相关的命令中,都可以使用SCHEMA这个关键字来替代关键字TABLE
  2. 语言

创建数据库

hive> CREATE DATABASE financials
    > LOCATION 'my/prefered/directory';

hive> CREATE DATABASE financials
    > COMMENT 'Holds all financial tables';

hive> DESCRIBE DATABASE financials;
hive> CREATE DATABASE financials
    > WITH DBPROPERTIES ('creator' = 'me', 'date' = '2016-06-22');
hive> DESCRIBE DATABASE EXTENDED financials;

删除数据库

hive> DROP DATABASE IF EXISTS financials CASCADE;
[restrict]

4.2 修改数据库

hive> ALTER DATABASE financials
    > SET DBPROPERTIES ('edited-by' = 'dba');

4.3 创建表

创建

CREATE TABLE employees (
    name STRING COMMENT 'Employee name',
    salary FLOAT COMMENT 'Employee salary',
    subordinates ARRAY<STRING> COMMENT 'Names of subordinates',
    deductions MAP<STRING, FLOAT> COMMENT 'Keys are deductions names, values are percentages',
    address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> COMMENT 'Home address'
)
COMMENT 'Description of the table'
TBLPROPERTIES ('creator' = 'me', 'created_at' = '2016-06-22', ...)
LOCATION 'user/hive/warehouse/mydb.db/employees';

描述

hive> DESCRIBE EXTENDED mydb.employees;

hive> DESCRIBE FORMATTED mydb.employees;

实际使用FORMATTED更多一些。

外部表

CREATED EXTERNAL TABLE ...

可以在DESCRIBE EXTENDED tablename语句的输出中看到以下信息:
... tableType:MANAGED_TABLE)
... tableType:EXTERNAL_TABLE)

分区表、管理表

创建分区表

CREATE TABLE employees (
    name STRING,
    salary FLOAT,
    subordinates ARRAY<STRING>,
    deductions MAP<STRING, FLOAT>,
    address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING);

分区过滤器:

WHERE country = 'US' AND state = 'IL';
hive> SHOW PARTITIONS employees PARTITION(country='US');

自定义表的存储格式

  1. SerDe
  2. InputFormat
  3. OutputFormat

4.6 修改表

重命名

ALTER TABLE log_messages RENAME TO logmsgs;

增加、修改和删除表分区

ALTER TABLE log_messages ADD IF NOT EXISTS
PARTITION (year=2000, month=1, day=1) LOCATION '/logs/2000/1/1'
PARTITION (year=2000, month=1, day=2) LOCATION '/logs/2000/1/2'
PARTITION (year=2000, month=1, day=3) LOCATION '/logs/2000/1/3'
ALTER TABLE log_messages PARTITION (year=2000,month=1,day=1)
SET LOCATION 's3n://outbucket/logs/2000/01/01'
ALTER TABLE log_messages DROP IF EXISTS PARTITION (year=2000,month=1,day=1)

修改列信息

ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT
COMMENT 'The hours, minutes, and seconds part of the timestamp'
AFTER severity;

增加列

ALTER TABLE log_messages ADD COLUMNS (
    app_name STRING COMMENT 'Application name',
    session_id LONG COMMENT 'The current session id'
);

删除或者替换列

ALTER TABLE log_messages REPLACE COLUMNS (
    hours_mins_secs INT COMMENT 'hours, minutes, seconds from timestamp',
    severity STRING COMMENT 'The message severity',
    message STRING COMMENT 'The rest of the message'
);

修改表属性

ALTER TABLE log_messages SET TBLPROPERTIES (
    'notes' = 'The process id is no longer captured; this column is always NULL'
);

修改存储属性

ALTER TABLE log_messages
PARTITION(year=2000, month=1, day=1)
SET FILEFORMAT SEQUENCEFILE;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值