Hive基础操作_第1页
Hive基础操作_第2页
Hive基础操作_第3页
Hive基础操作_第4页
Hive基础操作_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Hive 基础(2):库、表、字段、交互式查询的基本操作目录-· 1、命令行操作· 2、表操作· 3、列操作· 4、查看变量· 5、一个完整的建库、表例子· 6、常用语句示例· 7、Refer:1、命令行操作(1)打印查询头,需要显示设置:set hive.cli.print.header=true; (2)加"-",其后的都被认为是注释,但 CLI 不解析注释。带有注释的文件只能通过这种方式执行: hive -f script_name (3)-e后跟带引号的hive指令或

2、者查询,-S去掉多余的输出: hive -S -e "select * FROM mytable LIMIT 3" > /tmp/myquery (4)遍历所有分区的查询将产生一个巨大的MapReduce作业,如果你的数据集和目录非常多, 因此建议你使用strict模型,也就是你存在分区时,必须指定where语句 hive> set hive.mapred.mode=strict;(5)显示当前使用数据库set hive.cli.print.current.db=true;(6)设置 Hive Job 优先级set map

3、red.job.priority=VERY_HIGH | HIGH | NORMAL | LOW | VERY_LOW(VERY_LOW=1,LOW=2500,NORMAL=5000,HIGH=7500,VERY_HIGH=10000)set mapred.job.map.capacity=M设置同时最多运行M个map任务set mapred.job.reduce.capacity=N设置同时最多运行N个reduce任务(7)Hive 中的Mapper个数的是由以下几个参数确定的:mapred.min.split.size ,mapred.max.split.size ,dfs.block.s

4、izesplitSize = Math.max(minSize, Math.min(maxSize, blockSize);map个数还与inputfilles的个数有关,如果有2个输入文件,即使总大小小于blocksize,也会产生2个mapmapred.reduce.tasks用来设置reduce个数。2、表操作(1)查看某个表所有分区 SHOW PARTITIONS ext_trackflow 查询具体某个分区 SHOW PARTITIONS ext_trackflow PARTITION(statDate='20140529'); 

5、;(2)查看格式化的完整表结构 desc formatted ext_trackflow; DESCRIBE EXTENDED ext_trackflow; (3)删除分区:分区的元数据和数据将被一并删除,但是对于扩展表则只删除元数据 ALTER TABLE ext_trackflow DROP PARTITION (statDate='20140529'); (4)查询是外部表还是内部表 DESCRIBE EXTENDED tablename (5)复制表结构 CREATE EXTERNAL TA

6、BLE IF NOT EXISTS mydb.employees3  LIKE mydb.employees  LOCATION '/path/to/data' Note:如果你忽略关键字EXTERNAL,那么将依据 employees 是外部还是内部,如果加了那么一定是EXTERNAL,并要LOCATION (6)为内部表某个分区导入数据,Hive将建立目录并拷贝数据到分区当中 LOAD DATA LOCAL INPATH '$env:HOME/california-employees'&#

7、160;INTO TABLE employees PARTITION (country = 'US', state = 'CA'); (7)为外部表某个分区添加数据 ALTER TABLE log_messages ADD  IF NOT EXISTS PARTITION(year = 2012, month = 1, day = 2) LOCATION 'hdfs:/master_server/data/log_messages/2012/01/02' Note:Hive并不关心分区,

8、目录是否存在,是否有数据,这会导致没有查询结果 (8)修改表:在任何时候你都可以修改表,但是你仅仅修改的是表的元数据,都实际数据不会造成任何影响 例如更改分区指定位置,这个命令不会删除旧的数据 ALTER TABLE log_messages PARTITION(year = 2011, month = 12, day = 2) SET LOCATION 's3n:/ourbucket/logs/2011/01/02'(9)更改表属性ALTER TABLE log_messages SET TBLPROPERTIES ('note

9、s' = 'The process id is no longer captured; this column is always NULL');(10)更改存储属性ALTER TABLE log_messagesPARTITION(year = 2012, month = 1, day = 1)SET FILEFORMAT SEQUENCEFILE;Note:如果table是分区的话那么partition是必须的(11)指定新的 SerDeALTER TABLE table_using_JSON_storageSET SERDE 'com.example.JS

10、ONSerDe'WITH SERDEPROPERTIES ('prop1' = 'value1','prop2' = 'value2');Note:SERDEPROPERTIE解释SERDE用的何种模型,属性值和名称都为字符串,方便告诉用户,为自己指定SERDE并且应用于什么模型为当前SERDE设定ALTER TABLE table_using_JSON_storageSET SERDEPROPERTIES ('prop3' = 'value3','prop4' = '

11、;value4');(12)改变存储属性ALTER TABLE stocksCLUSTERED BY (exchange, symbol)SORTED BY (symbol)INTO 48 BUCKETS;(13)复杂更改表语句:为各种不同的操作添加 hook ALTER TABLE TOUCHALTER TABLE log_messages TOUCHPARTITION(year = 2012, month = 1, day = 1);典型的应用场景就是当分区有改动的时候,那么将触发hive -e 'ALTER TABLE log_messages TOUCH PARTITI

12、ON(year = 2012, month = 1, day = 1);'(14)ALTER TABLE ARCHIVE PARTITION 捕获分区文件到Hadoop archive file也就是HARALTER TABLE log_messages ARCHIVEPARTITION(year = 2012, month = 1, day = 1);(只可以用在被分区的表)(15)保护分区不被删除和查询ALTER TABLE log_messagesPARTITION(year = 2012, month = 1, day = 1) ENABLE NO_DROP;ALTER TAB

13、LE log_messagesPARTITION(year = 2012, month = 1, day = 1) ENABLE OFFLINE;Note:与ENABLE对应的是DISABLE,不能应用在未被分区的表(16)按正条件(正则表达式)显示表hive> SHOW TABLES '.*s'(17)外部表、内部表互转alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='TRUE');  /内部表转外部表 alter table tablePartitio

14、n set TBLPROPERTIES ('EXTERNAL'='FALSE');  /外部表转内部表 (18)分区与分桶:partition(分区:按目录保存文件,每个partition对应一个目录)例如:?1234567891011CREATE EXTERNAL TABLE table1 (    column1           STRING,&#

15、160;   column2          STRING,    column3           STRING,)PARTITIONED BY (dt STRING)ROW FORMAT DELIMITED FIELDS TERMINATED

16、 BY '|'STORED AS TEXTFILE;ALTER TABLE table1 ADD IF NOT EXISTS PARTITION (dt=20090105);ALTER TABLE table1 ADD IF NOT EXISTS PARTITION (dt=20090102);ALTER TABLE table1 ADD I

17、F NOT EXISTS PARTITION (dt=20081231);bucket(分桶,对指定列作hash,每个bucket对应一个文件)?12345678910111213CREATE TABLE VT_NEW_DATA(    column1           STRING,    column2   &#

18、160;      STRING,    column3           STRING,)CLUSTERED BY (column1)SORTED BY (column1)INTO 48 BUCKETSROW FORMAT DELIMITED  FIELDS TERMINAT

19、ED BY '|'  LINES TERMINATED BY 'n'STORED AS RCFILE;3、列操作(1)重命名列,更改位置,类型和注释 ALTER TABLE log_messages CHANGE COLUMN hms hours_minutes_seconds INT COMMENT 'The hours, minutes, and seconds part of the timestamp' AFT

20、ER severity; 更改名称: new column old column type comment不是必须的,你可以添加注释 AFTER用于更改字段位置 仅修改了元数据并未对源data做任何改动 (2)添加新列 ALTER TABLE log_messages ADD COLUMNS ( app_name STRING COMMENT 'Application name', session_id LONG COMMENT 'The current session id');&

21、#160;(3)删除和替换列:慎用! ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type COMMENT col_comment, .) ADD是代表新增一字段,字段位置在所有列后面(partition列前) REPLACE则是表示替换表中所有字段。 REPLACE COLUMNS removes all existing columns and adds the new set of columns.  REPLACE COLUMNS can also be

22、used to drop columns. For example: "ALTER TABLE test_change REPLACE COLUMNS (a int, b int);" will remove column c' from test_change's schema. Note that this does not delete underlying data, it just changes the schema.(4)REGEX Column SpecificationSELECT 语句可以使用正则表达式做列选择,下面的语句查询除

23、了 ds 和 hr 之外的所有列:SELECT (ds|hr)?+.+ FROM test4、查看变量hive> set;  hive> set-v;  even more output! set输出 hivevar,hiveconf,system 和 env 命名空间下的所有变量。 set -v包括了输出Hadoop定义的全部变量。 hive> set hivevar:foo=hello; hive> set hivevar:foo; hivevar:foo=hello 使用变量

24、: hive> create table toss1(i int, $hivevar:foo string); 5、一个完整的建库、表例子?123456789101112131415161718192021222324252627282930313233343536373839- 创建数据库create database ecdata WITH DBPROPERTIES ('creator' = 'June', 'date'

25、0;= '2014-06-01');- 或者使用 COMMENT 关键字- 查看数据库描述DESCRIBE DATABASE ecdata;DESCRIBE DATABASE EXTENDED  ecdata;- 切库use ecdata;  - 删除表drop table ext_trackflow; - 创建表create EXTERNAL table

26、60;IF NOT EXISTS ext_trackflow (    cookieId     string        COMMENT '05dvOVC6Il6INhYABV6LAg=',    cate1        string&#

27、160;       COMMENT '4',    area1        string        COMMENT '102',    url       &#

28、160;  string        COMMENT '    trackTime    string        COMMENT '2014-05-25 23:03:36',    trackURLMap  map<

29、;string,String>        COMMENT '"area":"102","cate":"4,29,14052"',)PARTITIONED BY (statDate STRING)ROW FORMAT DELIMITEDFIELDS TERMINATED BY '001'COLLECTION&

30、#160;ITEMS TERMINATED BY '002'MAP KEYS TERMINATED BY '003'LINES TERMINATED BY 'n'STORED AS TEXTFILELOCATION '/DataWarehouse/ods/TrackFlowTable' -添加分区语句ALTER TABLE ext_trackflow ADD

31、60;PARTITION (statDate='20140525') LOCATION '/DataWarehouse/ods/TrackFlowTable/20140525'  -每天建立分区yesterday=date -d '1 days ago' +'%Y%m%d'hive -e "use ecdata; ALTER TABLE ext_trackflow

32、 ADD PARTITION (statDate='$yesterday') LOCATION '/DataWarehouse/ods/TrackFlowTable/$yesterday'"6、常用语句示例(1)按页面类型统计 pv select pageType, count(pageType) from ext_trackflow where statDate = '20140521' group by pageType; Note:一般 SELECT 查询会扫描

33、整个表,使用 PARTITIONED BY 子句建表,查询就可以利用分区剪枝(input pruning)的特性 Hive 当前的实现是,只有分区断言出现在离 FROM 子句最近的那个WHERE 子句中,才会启用分区剪枝(2)导出查询结果到本地的两种方式INSERT OVERWRITE LOCAL DIRECTORY '/home/jun06/tmp/110.112.113.115' select area1, count(area1) from ext_trackflow where statDate = '20140521' group by ar

34、ea1  having  count(area1) > 1000;hive -e 'use ecdata; select area1, count(area1) from ext_trackflow where statDate = '20140521' group by area1  having  count(area1) > 1000;' > a.txt(3)map 数据结构的查询与使用select trackURLMap, extField, unitParamMap, queryParamMap

35、 from ext_trackflow where statDate = '20140525' and size(unitParamMap)!=0 limit 10;(4)下面的查询语句查询销售记录最大的 5 个销售代表。SET mapred.reduce.tasks = 1;SELECT * FROM test SORT BY amount DESC LIMIT 5;(5)将同一表中数据插入到不同表、路径中:FROM srcINSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100INSERT OVERWR

36、ITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value

37、 WHERE src.key >= 300;(6)用streaming方式将文件流直接插入文件:hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09'(7)Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。Hive 不支持所有非等值的连接,因为非等值

38、连接非常难转化到 map/reduce 任务 LEFT,RIGHT和FULL OUTER关键字用于处理join中空记录的情况LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现join 时,每次 map/reduce 任务的逻辑是这样的:reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统实践中,应该把最大的那个表写在最后(8)join 查询时,需要注意几个关键点只支持等值joinSELECT a.* FROM a JOIN b ON (a.id = b.id)SELECT a.* FROM a JOI

39、N b     ON (a.id = b.id AND a.department = b.department)可以 join 多于 2 个表,例如SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)Note:如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务(9)LEFT,RIGHT和FULL OUTERSELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)如果你想限制 join 的输出,应该在 WHERE 子句中写过滤条件或是在 join 子句中写容易混淆的问题是表分区的情况 SELECT c.val, d.val FROM c LEFT OUTER JOIN d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论