02 Hive技术整理及应用.docx
- 文档编号:24904004
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:15
- 大小:21.52KB
02 Hive技术整理及应用.docx
《02 Hive技术整理及应用.docx》由会员分享,可在线阅读,更多相关《02 Hive技术整理及应用.docx(15页珍藏版)》请在冰豆网上搜索。
02Hive技术整理及应用
一、文档说明
熟悉Hive功能,了解基本开发过程,及在项目中的基本应用。
二、Hive(数据提取)概述
Hive是构建在HDFS和Map/Reduce之上的可扩展的数据仓库。
是对HADOOP的Map-Reduce进行了封装,类似于sql语句(hive称之为HQL)计算数据从而代替编写代码对mapreduce的操作,数据的来源还是HDFS上面的文件。
Hive中的表可以分为托管表和外部表,托管表的数据移动到数据仓库目录下,由Hive管理,外部表的数据在指定位置,不在Hive的数据仓库中,只是在Hive元数据库中注册。
创建外部表采用“createexternaltablename”方式创建,并在创建表的同时指定表的位置。
Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中(如果数据是在HDFS上;但如果数据是在本地文件系统中,那么是将数据复制到表所在的目录中)。
三、Hive的元数据
Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中。
目前Hive将元数据存储在数据库中,如Mysql、Derby中。
Hivemetastore三种存储方式:
Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储。
远端存储比较适合生产环境。
1、使用derby数据库存储元数据(内嵌的以本地磁盘作为存储),这称为“内嵌配置”。
这种方式是最简单的存储方式,只需要在hive-default.xml或hive-site.xml做如下配置便可。
使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。
这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误(这是一个很常见的错误)。
2、使用本机mysql服务器存储元数据,这称为“本地metastore”。
这种存储方式需要在本地运行一个mysql服务器,
3、使用远端mysql服务器存储元数据。
这称为“远程metastore”。
这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动meta服务。
四、Hive数据导入方式
1、从本地文件系统中导入数据到Hive表
hive>loaddatalocalinpath'wyp.txt'intotablewyp;
2、HDFS上导入数据到Hive表
hive>loaddatainpath'/home/wyp/add.txt'intotablewyp;
3、从别的表中查询出相应的数据并导入到Hive表中
hive>insertintotabletest
>partition(age='25')
>selectid,name,tel
>fromwyp;
五、Hive数据导出方式
1、导出到本地文件系统
hive>insertoverwritelocaldirectory'/home/wyp/wyp'
>select*fromwyp;
[boco@cloud216~]$hive-e"select*fromwyp">>local/wyp.txt
2、导出到HDFS中
hive>insertoverwritedirectory'/home/wyp/hdfs'
>select*fromwyp;
3、导出到Hive的另一个表中
hive>insertintotabletest
>partition(age='25')
>selectid,name,tel
>fromwyp;
六、HiveQL的常用操作
HiveQL是一种类似SQL的语言,它与大部分的SQL语法兼容,但是并不完全支持SQL标准,如HiveQL不支持更新操作,也不支持索引和事务,它的子查询和join操作也很局限。
#hive启动
1、退出hive
hive>quit;
2、查看数据库
hive>showdatabases;
3、创建数据库
hive>createdatabasetest;
4、创建数据库,并设置其存放的位置,注意该路径在hdfs下
hive>CREATEDATABASEfinancials
>LOCATION'/my/preferred/directory';
5、使用哪个数据库
hive>usedefault;
6、创建表
hive>createtablet1(keystring);
7、判断一个表是外部表还是内部表
hive>DESCRIBEEXTENDEDtablename;
8、查看该数据库中的所有表
hive>showtables;
9、显示表结构
hive>desctablename;
hive>descextendedtmr_format;
10、查看表有哪些分区
hive>showpartitionst1;
11、删除分区:
ALTERTABLEtable_nameDROPpartition_spec
hive>ALTERTABLEday_hour_tableDROPPARTITION(dt='2008-08-08',hour='09');
12、删除表
hive>droptablet1;
13、移动hdfs中数据到t1表中
hive>loaddatainpath‘/root/inner_table.dat’intotablet1;
14、上传本地数据到hdfs中
hive>loaddatalocalinpath‘/root/inner_table.dat’intotablet1;
15、查询当前linux文件夹下的文件
hive>!
ls;
16、查询当前hdfs文件系统下’/'目录下的文件
hive>dfs-ls/;
•以非交互式模式执行sql文件
•HIVE_HOME/bin/hive-f/home/my/hive-script.sql
•在进入交互模式之前,执行初始化sql文件
•HIVE_HOME/bin/hive-i/home/my/hive-init.sql
六、Hive内部表、外部表
1.内部表:
createtablett(namestring,agestring)location'/input/table_data';
上传hdfs数据到表中:
loaddatainpath'/input/data'intotablett;
此时会将hdfs上的/input/data目录下的数据转移到/input/table_data目录下。
删除tt表后,会将tt表的数据和元数据信息全部删除,即最后/input/table_data下无数据,当然/input/data下再上一步已经没有了数据!
如果创建内部表时没有指定location,就会在/user/hive/warehouse/下新建一个表目录,其余情况同上。
注意的地方就是:
loaddata会转移数据!
2.外部表:
createexternaltableet(namestring,agestring);
此时,会在/user/hive/warehouse/新建一个表目录et
loaddatainpath'/input/edata'intotableet;
此时会把hdfs上/input/edata/下的数据转到/user/hive/warehouse/et下,删除这个外部表后,/user/hive/warehouse/et下的数据不会删除,但是/input/edata/下的数据在上一步load后已经没有了!
数据的位置发生了变化!
本质是load一个hdfs上的数据时会转移数据!
3.其他:
(1)加上location用法一样,只不过表目录的位置不同而已。
(2)加上partition用法也一样,只不过表目录下会有分区目录而已。
(3)loaddatalocalinpath直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。
七、Hive日期函数
UNIX时间戳转日期函数:
from_unixtime
语法:
from_unixtime(bigintunixtime[,stringformat])
返回值:
string
说明:
转化UNIX时间戳(从1970-01-0100:
00:
00UTC到指定时间的秒数)到当前时区的时间格式
举例:
hive>selectfrom_unixtime(1323308943,’yyyyMMdd’)fromdual;
20111208
获取当前UNIX时间戳函数:
unix_timestamp
语法:
unix_timestamp()
返回值:
bigint
说明:
获得当前时区的UNIX时间戳
举例:
hive>selectunix_timestamp()fromdual;
1323309615
日期转UNIX时间戳函数:
unix_timestamp
语法:
unix_timestamp(stringdate)
返回值:
bigint
说明:
转换格式为“yyyy-MM-ddHH:
mm:
ss“的日期到UNIX时间戳。
如果转化失败,则返回0。
举例:
hive>selectunix_timestamp(’2011-12-0713:
01:
03′)fromdual;
1323234063
指定格式日期转UNIX时间戳函数:
unix_timestamp
语法:
unix_timestamp(stringdate,stringpattern)
返回值:
bigint
说明:
转换pattern格式的日期到UNIX时间戳。
如果转化失败,则返回0。
举例:
hive>selectunix_timestamp(’2011120713:
01:
03′,’yyyyMMddHH:
mm:
ss’)fromdual;
1323234063
日期时间转日期函数:
to_date
语法:
to_date(stringtimestamp)
返回值:
string
说明:
返回日期时间字段中的日期部分。
举例:
hive>selectto_date(’2011-12-0810:
03:
01′)fromdual;
2011-12-08
日期转年函数:
year
语法:
year(stringdate)
返回值:
int
说明:
返回日期中的年。
举例:
hive>selectyear(’2011-12-0810:
03:
01′)fromdual;
2011
hive>selectyear(’2012-12-08′)fromdual;
2012
日期转月函数:
month
语法:
month(stringdate)
返回值:
int
说明:
返回日期中的月份。
举例:
hive>selectmonth(’2011-12-0810:
03:
01′)fromdual;
12
hive>selectmonth(’2011-08-08′)fromdual;
8
日期转天函数:
day
语法:
day(stringdate)
返回值:
int
说明:
返回日期中的天。
举例:
hive>selectday(’2011-12-0810:
03:
01′)fromdual;
8
hive>selectday(’2011-12-24′)fromdual;
24
日期转小时函数:
hour
语法:
hour(stringdate)
返回值:
int
说明:
返回日期中的小时。
举例:
hive>selecthour(’2011-12-0810:
03:
01′)fromdual;
10
日期转分钟函数:
minute
语法:
minute(stringdate)
返回值:
int
说明:
返回日期中的分钟。
举例:
hive>selectminute(’2011-12-0810:
03:
01′)fromdual;
3
日期转秒函数:
second
语法:
second(stringdate)
返回值:
int
说明:
返回日期中的秒。
举例:
hive>selectsecond(’2011-12-0810:
03:
01′)fromdual;
1
日期转周函数:
weekofyear
语法:
weekofyear(stringdate)
返回值:
int
说明:
返回日期在当前的周数。
举例:
hive>selectweekofyear(’2011-12-0810:
03:
01′)fromdual;
49
日期比较函数:
datediff
语法:
datediff(stringenddate,stringstartdate)
返回值:
int
说明:
返回结束日期减去开始日期的天数。
举例:
hive>selectdatediff(’2012-12-08′,’2012-05-09′)fromdual;
213
日期增加函数:
date_add
语法:
date_add(stringstartdate,intdays)
返回值:
string
说明:
返回开始日期startdate增加days天后的日期。
举例:
hive>selectdate_add(’2012-12-08′,10)fromdual;
2012-12-18
日期减少函数:
date_sub
语法:
date_sub(stringstartdate,intdays)
返回值:
string
说明:
返回开始日期startdate减少days天后的日期。
举例:
hive>selectdate_sub(’2012-12-08′,10)fromdual;
2012-11-28
selectfrom_unixtime(unix_timestamp())fromenodeblimit1;
2014-04-2508:
47:
31
selectto_date(from_unixtime(unix_timestamp()))fromenodeblimit1;
2014-04-25
selecthour(from_unixtime(unix_timestamp()))fromenodeblimit1;
8
selectfrom_unixtime(unix_timestamp(),'yyyyMMddHH')fromenodeblimit1;
2014042508
selectfrom_unixtime(unix_timestamp(),'yyyy-MM-ddHH:
mm:
ss')fromenodeblimit1;
2014-04-2509:
15:
58
七、Hive开发配置(java)
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
Connectioncon=DriverManager.getConnection(
"jdbc:
hive:
//ip:
50000/default","hive","hadoop");
在Hive的jar包中,“org.apache.hadoop.hive.jdbc.HiveDriver”负责提供JDBC接口,客户端展示程序有了这个包,就可以把Hive当成一个数据库来使用。
建立与Hive的连接:
默认只能连接到default,通过上面的两行代码建立连接后,其他的操作与传统数据库无太大差别。
详细配置参见《细细品味Hadoop_Hadoop集群(第14期)_Hive应用开发》第三章节。
八、数据类型
原子数据类型
类型
描述
示例
TINYINT
1个字节(8位)有符号整数
1
SMALLINT
2字节(16位)有符号整数
1
INT
4字节(32位)有符号整数
1
BIGINT
8字节(64位)有符号整数
1
FLOAT
4字节(32位)单精度浮点数
1.0
DOUBLE
8字节(64位)双精度浮点数
1.0
BOOLEAN
true/false
TRUE
STRING
字符串
‘xia’,”xia”
复杂数据类型
类型
描述
示例
ARRAY
一组有序字段。
字段的类型必须相同
Array(1,2)
MAP
一组无序的键/值对。
键的类型必须是原子的,值可以是任何类型,同一个映射的键的类型必须相同,值得类型也必须相同
Map(‘a’,1,’b’,2)
STRUCT
一组命名的字段。
字段类型可以不同
Struct(‘a’,1,1,0)
九、Hive表分区
a、单分区建表语句:
createtableday_table(idint,contentstring)partitionedby(dtstring);单分区表,按天分区,在表结构中存在id,content,dt三列。
以dt为文件夹区分
b、双分区建表语句:
createtableday_hour_table(idint,contentstring)partitionedby(dtstring,hourstring);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
先以dt为文件夹,再以hour子文件夹区分
添加分区表语法(表已创建,在此基础上添加分区):
ALTERTABLEtable_nameADD
partition_spec[LOCATION'location1']
partition_spec[LOCATION'location2']...
ALTERTABLEday_tableADD
PARTITION(dt='2008-08-08',hour='08')
location'/path/pv1.txt'
删除分区语法:
ALTERTABLEtable_nameDROP
partition_spec,partition_spec,...
用户可以用ALTERTABLEDROPPARTITION来删除分区。
分区的元数据和数据将被一并删除。
例:
ALTERTABLEday_hour_tableDROPPARTITION(dt='2008-08-08',hour='09');
数据加载进分区表中语法:
LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]
例:
LOADDATAINPATH'/user/pv.txt'INTOTABLEday_hour_tablePARTITION(dt='2008-08-08',hour='08');
LOADDATAlocalINPATH'/user/hua/*'INTOTABLEday_hourpartition(dt='2010-07-07');
当数据被加载至表中时,不会对数据进行任何转换。
Load操作只是将数据复制至Hive表对应的位置。
数据加载时在表下自动创建一个目录
基于分区的查询的语句:
SELECTday_table.*FROMday_tableWHEREday_table.dt>='2008-08-08';
查看分区语句:
hive>showpartitionsday_hour_table;OKdt=2008-08-08/hour=08dt=2008-08-08/hour=09dt=2008-08-09/hour=09
十、Hsq执行过程(explain)
Explain+具体执行的sql
十一、Hive中视图机制的初步使用及分析
Hive0.6版本及以上支持视图(View,详见Hive的RELEASE_NOTES.txt),HiveView具有以下特点:
1)View是逻辑视图,暂不支持物化视图(后续将在1.0.3版本以后支持);
2)View是只读的,不支持LOAD/INSERT/ALTER。
需要改变View定义,可以是用AlterView;
3)View内可能包含ORDERBY/LIMIT语句,假如一个针对View的查询也包含这些语句,则View中的语句优先级高;
4)支持迭代View。
CDH4中自带的Hive版本为0.10.0,支持的View是逻辑视图,因此本质上来说View只是为了使用上的方便,从执行效率上来说没有区别,甚至可能因为要多一次对MetaStore元数据的操作效率略有下降
执行explain查看View实际被翻译后的执行过程:
explainselectname_lengthfromtest_view;
可以看出,对View进行的查找过程,实际还是对原始test表进行的查询操作(分为Stage-0和Stage-1两个阶段)。
十二、问题
1、hive数据导入的中文乱码问题
解决:
hive属于java体系,数据编码是unicode,所以从生产库抽过来的GB18030极其子编码集的数据,load到hive是可能出现乱码的。
将GBK转为UTF-8
[boco@cloud21620140402]$iconv-fGBK-tUTF820140319200000_AA41.csv>20140319200000_AA41.csv;
2、hive与传统数据库的性能差距有多大?
3、Hql在生产环境如何进行调度控制(被调起),如何控制性能
4、先把hive跑起来(桦林)
Byzhaofeng2014-3-25beijin(一天)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 02 Hive技术整理及应用 Hive 技术 整理 应用