Hadoop生态系统就是为处理如此大数据集而产生的一个合乎成本效益的解决方案。
- MapReduce:将计算任务分成多个处理单元分散到一群家用的或服务器级别的硬件机器上。
- HDFS:分布式文件系统
- HIVE:如何从一个现有的数据基础架构转移到Hadoop上。,这就是HIVE出现的原因。
HIVE提供了HiveQL的查询语言。将大多数的查询转换为MapReduce任务。
Hive
适用:静态数据分析,不需要开始响应给出结果,数据本身不会发生太大且频繁的变化。
Hive内部是啥
- metastoreservice(元数据服务):储存表模式信息以及其他元数据信息
- Derby SQL服务器,默认将元数据保存到这里,但是不支持两个以上的并发HIVE CIL,所以替换成MySQL.
命令
- 使用hive --help查看
Usage ./hive <parameters> --service serviceName <service parameters>
Service List: beeline cli help hiveburninclient hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat schemaTool version
Parameters parsed:
--auxpath : Auxillary jars
--config : Hive configuration directory
--service : Starts specific service/component. cli is default
Parameters used:
HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
HIVE_OPT : Hive options
For help on a particular service:
./hive --service serviceName --help
Debug help: ./hive --debug --help
Service列表,使用hive --service name启动
我们可以通过 hive --help --service cli查看CLI选项命令
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
hive -e “select * from table_name”:一次性命令。
增加-S可以开启静默模式,去掉OK和TIME行。
hive -f 路径:执行文件中的sql语句。
hive -i 文件名当CIL启动时,提示符出现前会先执行这个文件中的命令
2. 变量和属性
用set更新。例如 set hivevar:foo = bar;
数据类型和文件格式
基本数据类型 | 集合数据类型 | |
---|---|---|
TINYINT | STRUCT | |
SMALINT | MAP | 类似Python字典 |
INT | ARRAY | 类似Python数组,要求类型一致 |
BIGINT | ||
BOOLEAN | ||
FLOAT | ||
DOUBLE | ||
STRING | ||
TIMESTAMP | ||
BINARY |
读取文本文件
row format delimited fields terminated by ‘,’ – 列分隔符
collection items terminated by ‘_’ --MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
map keys terminated by ‘:’ – MAP中的key与value的分隔符
lines terminated by ‘\n’; – 行分隔符
DDL
数据库
- 创建数据库:
create database if not exists database_name;
- 查看数据库:
show Databases like '';
后追加正态筛选 - 数据库创建默认放在/user/hive/warehouse/financials.db,可以在创建数据库后追加
LOCATION ‘’地址‘’
修改位置 - 添加描述信息,后追加
comment "XXX"
;通过DESCRIBE DATABASE database_name
查看描述信息 - 除了描述信息还可以添加属性信息,后追加
with DBPROPERTIES('creator
=‘xx’,‘date’=’’);通过DESCRIBE DATABASE EXTENDED database_name;
查看 USE database_name
调用别的数据库- 删除数据库:
DROP DATABASE IF EXISTS database_name;
- 修改数据库
alter database database_name set dbproperties()
只能修改这个。
表
- 创建表:
CREATE TABLEIF NOT EXISTs mydb. employees()comment XXXX tblproperties() location "/database_name"
show tables like ".*";
orshow tables in database_name
展示表,不能同时使用DESCRIBE EXTENDED mydb. employees;
管理表和外部表
管理表:删除这个表,hive也会删除表里的数据
外部表:
创建外部表:CREATE EXTERNAL TABLE IF NOT EXISTs stocks
查看是否外部表:DESCRIBE EXTENDED tablename
中的tableType,并且会显示出分区信息。
复制表:CREATE EXTERNALTABLE IF NOT EXISTs mydb.employees LIKE mydb.employees LOCATION '/path/to/ data ' ;
复制外部表,得到外部表,内部表得到内部表。加上EXTERNALTABLE 变成外部表
分区表
创建分区表: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);
创建好之后在hdfs上表的文件下下多几个文件夹
查看所有分区:SHOW PARTITIONS employees;
12. 删除表:DROP TABLE IF EXISTS employees;
通过fs.trash.interval来设置回收站。
设置。对于外部表,表的元数据信息会被删除,但是表中的数据不会被删除。
13. 修改表:alter table table_name
表的重命名alter table table_name rename xxx
增加修改表分区:alter table table_name add if not exists partiton()location ''
修改列信息:alter table table_name change columns xxx 类型 comment ''
增加列:alter table table_name add if not exists columns
删除或者替换列:alter table table_name replace columns()
修改表属性:alter table table_name set tblproperties()
DML
- 向表中加载数据:HIVE不像MySql一样,没有那么多频繁插入、更新删除行级别样本的机会。通常采用大量的数据装载方式。或者通过hdfs上传到正确的文件夹。
load data local inpath "xxx" (overwrite) into table table_name patition ()
local不加的话,会从hdfs传文件进去,加了从本地传进去 - 通过查询语句向表中插入数据:
insert into table table_name partition(xx=xx,xx=xx) select * from table_name2 se where se.xx=xx and se.xx=xx
- 如果表非常大可以将上述改进成
from table_name2 se insert overwrite table table_name partiton() select * where xx=xx andxx=xx insert overwrite table table_name partiton() select * where xx=xx andxx=xx insert overwrite table table_name partiton() select * where xx=xx andxx=xx
- 动态分区插入:如果分区很多。,上面的代码会很庞大,可以采用动态分区插入
insert overwrite table table_name partition(xx1,xx2) select ... se.xx1,se.xx2 from table_name2 se
- 动态静态混合:
insert overwrite table table_name partition(xx=xx,xx) select... se.xx1,se.xx2 from table_name2 se where se.xx1 =
- 单个查询语句中创建表并加载数据:
CREATE TABLE ca_employees As SELECT name,salary, addressFROM employees WHERE se.state = 'CA ' ;
- 导出数据:hadoop fs -cp source path target_path 如果数据刚好是需要的格式;or
:INSERT OVERWRITE LocAL DIRECTORY '/tmp/ca_employees'SELECT name, salary, address FROM employees WHERE se.state - 'CA';