/* Hive提供了sql语言到map-reduce的映射器 Hive不算是完整的数据库,它是基于hadoop的数据查询分析工具,它不具备行数据的DML操作。 Hive提供了诸如分区,外部表,集合类型列,正则表达式等高级特性。 */ NoSQL,NOT Only SQL。并非是表格式的数据机构,甚至它的表结构是不固定的。不仅仅用sql来查询。 NewSQL,SQL的逆袭 解决"即席查询"的问题 Hive还不算是完整的数据库系统 数据仓库工具,可以把Hadoop下的原始结构化数据变为Hive中的表。 支持一种与SQL几乎完全相同的语言HiveQL。除了不支持更新,索引和事务,几乎SQL的其他 特征都能支持。 可以看成是SQL到Map-Reduce的映射器。 提供shell,JDBC/ODBC,Thrift,web等接口。 Hive 构架: Hive用户接口:shell,thrift,web等. Thrift服务器(Java 接口) 元数据库 "Derby,Mysql"等 解析器 Hadoop UDF = USER DEFINITION FUNCTION Hive安装 内嵌模式: 元数据保持在内嵌的Derby模式,只允许一个会话连接。 本地独立模式:在本地安装Mysql,把元数据放在Mysql内。 远程模式:元数据放置在远程的Mysql数据库。 Hive Sql语言 --创建表sql create table Loc( CDRID STRING, IMSI INT, .... ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE; --观看表的描述 DESCRIBE EXTENDED mydb.employees; --插入数据sql LOAD DATA LOCAL INPATH '/home/james/location_20120316.txt' OVERWRITE INTO TABLE LOC; INSERT OVERWRITE TABLE RESULT SELECT IMSI,IMEI,SUBSTR(CGI,8),STARTTIME,NULL,UPDATETYPE,3...... FROM LOC WHERE IMSI IS NOT NULL; --查询SQL SELECT IMSI,CGI,TIME FROM RESULT; SELECT BAR FROM POKES LIMIT 5; --表连接 SELECT RESULT.IMSI,LOC.INSTIME FROM RESULT JOIN LOC ON (RESULT.IMSI = LOC.IMSI); --显示库中的表名 show tables; --删除表 drop table abc; JDBC/ODBC接口 用户可以像传统关系数据库一样使用JDBC或ODBC连接Hive 目前还不成熟 使用jdbc的方式连接Hive,首先做的事情就是需要启劢hive的Thrift Server,否则连接hive的时候会报connection refused的错误。 启动命令: hive -- service hiveserver Hive的数据放在那儿? 数据在HDFS的warehouse目录下,一个表对应一个子目录。 桶与reduce 本地的/tmp目录存放日志和执行计划 集合数据类型 struct('John','Doe') map('first','john','last','Doe') array('john','Doe') 使用样例 create table employees( name STRING, salary FLOAT, subordinates ARRAY(<TRING>, deductions MAP<STRING,FLOAT>, address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>); ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' COLLECTION ITEMS TERMINATED BY '\002' MAP KEYS TERMINATED BY '\003' LINES TERMINATED BY '\n' STORED AS TEXTFILE; DDL操作 定义数据库 定义表 --创建和列表数据库 CREATE DATABASE financials; CREATE DATABASE IF NOT EXISTS financials; SHOW DATABASES; SHOW DATABASES LIKE 'h.*' --改变数据库存放目录 CREATE DATABASE financials LOCATION '/my/preferred/directory' --切换数据库 USE financials; --显示数据库名称 set hive.cli.print.current.db=true; --删除和更改数据库 DROP DATABASE IF EXISTS financials; DROP DATABASE IF EXISTS financials CASCADE; --数据库的扩展属性信息 ALTER DATABASE financials SET DBPROPERTIES('edited-by','Joe Dba'); --外部表 --方便对外部数据文件的阅读,而且不会将数据加载到oracle Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。 CREATE EXTERNAL TABLE IF NOT EXISTS stocks ( exchange STIRNG, ... ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/data/stocks' --分区表 --将数据物理上划分,但并不影响sql的操作。 create table employees( name STRING, salary FLOAT, ... ) PARTITIONED BY (country STRING,state STRING); 注意分区关键字并不需要出现在列字段当中。它会自动保存在目录名称中。 分区表的存储:会变成一个子目录里面的一系列文件。 --Strict模式及其对操作的影响 set hive.mapred.mode=strict; 若设置为strict模式,则不允许不指定条件查询,即where中没有分区条件的过滤。 除非设置为nostrict模式。 --列出分区 SHOW PARTITIONS employees PARTITION(country='US'); SHOW PARTITIONS employees PARTITION(country='US','state=AK'); --更改表 alter table xx rename to xx; --添加分区 alter table xx add if not exists partition(year=2011,month=1,day=1) location '/logs/2011/01/01' --列操作 --修改列的类型 alter table xx change column xx int; --新增列 alter table xx add columns (xx string comment ''); --replace列 alter table log_messages replace columns ( xx int comment '' ); DML操作 不支持行级别的DML操作。将数据放入表中的唯一办法就是批量载入。 --数据批量加载语句 Load data local input 'path' overwrite into table employees partition(country='US',state='CA') --insert overwrite语句 insert overwrite table employees partition(country='US',state='OR') select * from staged_employees se where se.cnty='US' and se.st='OR'; --数据插入分区表。Hadoop需要呆板的指定各个分区的数据,然后插入到分区表中。 --除非通过参数开启动态分区插入 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='US',state='IL') select * where se.cnty='US' and se.st='IL'; --动态分区插入,不必要指定分区条件。 set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nostrict; set hive.exec.max.dynamic.partitions.pernode=1000; insert overwrite table employees partition(country,state) select ..,se.cty,se.st from staged_employees se; --创建表 create table ... as select ... --导出数据 --由于数据文件本身是文本明文,可以直接使用hdfs的拷贝文件导出 -- INSERT OVERWRITE LOCAL DIRECTORY 'tmp/ca_employees' select name,salary,address from employees where se.state = 'CA'; --使用正则表达式 --查询以prick开头的任意列 SELECT sysmbol,price.* FROM stocks; --%相当于任意多个字符。_表示任意单个字符 SELECT NAME,ADDRESS.STREET FROM EMPLOYEES WHERE ADDRESS.STREET LIKE '%Ave.'; --RLIKE 指正则表达式 select name,address.street from employees where address.street RLIKE '.*(Chicago|Ontario).*'; --explode 函数 select array(1,2,3) from dual; [1,2,3] select explode(array(1,2,3)) as elements from src; 1, 2, 3 --嵌套视图 FROM ( select upper(name),salary,deductions["Federal Taxes"] as fed_taxes, round(salary*(1-deductions["Federal Taxes"])) as salary_minus_fed_taxes from employees )e select e.name,e.salary_minus_fed_taxes where e.salary_minus_fed_taxes >70000; --查询优化小技巧 --加快聚组统计的速度,原理相当于map-reduce中的combine。 --先在每个节点汇总统计,然后将汇总数推送到reduce节点 set hive.map.aggr=true; select count(*),avg(salary) from employees; --连接操作,支持大部分的关系代数连接方式(各种内连接,外连接,半连接) --连接是缓慢的操作! --原本是将数据送到reduce节点进行连接,使用"map-side joins",它会将两个表中的小表完整的复制到各个存在大表数据的节点, --然后连接后发送到reduce节点。 --不太成熟,会经常判断失误 支持大部分常见的关系代数连接方式 连接是缓慢的操作 使用map-side joins优化连接. select /*+ MAPJOIN(d) */ s.ymd,s.symbol,s.price_close,d.dividend FROM stocks s JOIN dividends d on s.ymd = d.ymd and s.symbol=d.symbol where s.symbol='AAPL'; --hive.auto.convert.join=true --hive 将自动判断是否适合使用mapjoin. --判断的条件是两个表中的其中小表是否足够小。 --hive.mapjoin.smalltable.filesize=25000000 --此参数是判断小表是否足够小的标准 --排序 order by --全局排序 sort by --多个reduce排序,不保证全局有序.仅在reducer节点内排序 distribute by--将相同的字段值送到同一个reduce节点,通常与sort by一块使用 select s.ymd,s.symbol,s.price_close from stocks s distribute by s.symbol sort by s.symbol asc,s.ymd asc; cluster by -- 相当于sort by + distribute by --bucket 抽样查询 抽样查询时数据分析里常见的操作 select * from number tablesample(BUCKET 3 OUT OF 10 ON rand())s; --块级抽样 select * from numbersflat TABLESAMPLE(0.1 PERCENT) S; --视图与索引 --Hive具有与关系型数据库基本类似的视图功能 Hive只有非常简单的索引,关系型数据库的索引时B+树算法 实现的,Hive的索引只是简单低把排序数据放到另外一个表中。