http://blog.sina.com.cn/s/blog_66474b16010182yu.html这篇可以较好地理解什么是外部表external

#创建表人信息表  person(String name,int age)

 hive> create table person(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE;

 OK

 Time taken: 0.541 seconds

#创建表票价信息表 ticket(int age,float price)

 hive> create table ticket(age INT,price FLOAT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE;

 OK

 Time taken: 0.154 seconds

#创建本地数据文件

 -rw-rw-r-- 1 hadoop hadoop  40 Feb  6 13:28 person.txt

 -rw-rw-r-- 1 hadoop hadoop  45 Feb  6 13:28 ticket.txt

#将本地的数据文件load到hive数据仓库中

 hive> LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/person.txt' OVERWRITE INTO TABLE person;

 Copying data from file:/home/hadoop/hfxdoc/person.txt

 Copying file: file:/home/hadoop/hfxdoc/person.txt

 Loading data to table default.person

 Deleted hdfs://10.15.107.155:8000/user/hive/warehouse/person

 OK

 Time taken: 0.419 seconds

 hive> LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/ticket.txt' OVERWRITE INTO TABLE ticket;

 Copying data from file:/home/hadoop/hfxdoc/ticket.txt

 Copying file: file:/home/hadoop/hfxdoc/ticket.txt

 Loading data to table default.ticket

 Deleted hdfs://10.15.107.155:8000/user/hive/warehouse/ticket

 OK

 Time taken: 0.25 seconds

#load命令会将数据文件移动到配置好的数据路径下:/user/hive/warehouse

 hive> show tables;

 hive> describe person

 hive> select * from person;

 OK

 huang   26

 lili    25

 dongdong        13

 wangxiao        5

 Time taken: 0.092 seconds

 hive> 

 #注意select *语句是不会编译成MapReduce程序的,所以很快。

#稍作复杂点的join查询

 hive> select * from person join ticket on person.age = ticket.age;

 MapReduce Total cumulative CPU time: 5 seconds 510 msec

 Ended Job = job_201301211420_0011

 MapReduce Jobs Launched: 

 Job 0: Map: 2  Reduce: 1   Cumulative CPU: 5.51 sec   HDFS Read: 519 HDFS Write: 71 SUCCESS

 Total MapReduce CPU Time Spent: 5 seconds 510 msec

 OK

 wangxiao        5       5       10.0

 dongdong        13      13      20.0

 lili    25      25      30.0

 huang   26      26      30.0

 Time taken: 32.465 seconds

 #这里查询语句被编译成MapReduce程序,在hadoop上执行

#采用外部表

#首先将本地文件put到hdfs文件路径下

 [hadoop@localhost hfxdoc]$ hadoop fs -mkdir /tmp/ticket

 [hadoop@localhost hfxdoc]$ hadoop fs -put person.txt /tmp/ticket

 [hadoop@localhost hfxdoc]$ hadoop fs -put ticket.txt /tmp/ticket          

 [hadoop@localhost hfxdoc]$ hadoop fs -ls /tmp/ticket

 Found 2 items

 -rw-r--r--   1 hadoop supergroup         40 2013-02-06 13:45 /tmp/ticket/person.txt

 -rw-r--r--   1 hadoop supergroup         45 2013-02-06 13:45 /tmp/ticket/ticket.txt

create external table person_ext(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE LOCATION '/tmp/ticket'

#LOCATION只能配置数据路径,而刚刚我们的路径下有两个表的文件?这样创建的其中一个表可以吗?

#不可以!所以,一个文件路径下面的所有文件都应该是关联这个数据表的数据文件。

#如果有其他表的文件,这个创建过程不会报错,因为,hive默认文本里的字符串类型都可以隐式转换成任何其他数据类型。比如你还有一个文件是一行三列的,那么第三列

#在person表中是解析不到的,如果每行只有一列,那么第二列将会用NULL来补齐。所以我们调整下hdfs文件路径。

 hive> select * from person_ext;

 OK

 huang   26

 lili    25

 dongdong        13

 wangxiao        5

 1       10

 2       10

 5       10

 13      20

 14      20

 25      30

 26      30

 31      40

 Time taken: 0.088 seconds

 hive> drop table person_ext;

#Drop外表的操作不会删除元信息以为的数据,所以hdfs上还是存在数据文件

#复杂类型的数据表,这里列之间以'\t'分割,数组元素之间以','分割

 #数据文件内容如下

 1 huangfengxiao   beijing,shanghai,tianjin,hangzhou

 2 linan   changchu,chengdu,wuhan

 

 hive> create table complex(name string,work_locations array<string>)

     > ROW FORMAT DELIMITED

     > FIELDS TERMINATED BY '\t'

     > COLLECTION ITEMS TERMINATED BY ',';

hive> describe complex;

 OK

 name    string

 work_locations  array<string>

hive> LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/complex.txt' OVERWRITE INTO TABLE complex

 hive> select * from complex;                                                                

 OK

 huangfengxiao   ["beijing","shanghai","tianjin","hangzhou"]

 linan   ["changchu","chengdu","wuhan"]

 Time taken: 0.125 seconds

hive> select name, work_locations[0] from complex;

 MapReduce Total cumulative CPU time: 790 msec

 Ended Job = job_201301211420_0012

 MapReduce Jobs Launched: 

 Job 0: Map: 1   Cumulative CPU: 0.79 sec   HDFS Read: 296 HDFS Write: 37 SUCCESS

 Total MapReduce CPU Time Spent: 790 msec

 OK

 huangfengxiao   beijing

 linan   changchu

 Time taken: 20.703 seconds

#如何分区?

 表class(teacher sting,student string,age int)

 Mis li huangfengxiao 20

 Mis li lijie 21

 Mis li dongdong 21

 Mis li liqiang 21

 Mis li hemeng 21

 Mr xu dingding 19

 Mr xu wangqiang 19

 Mr xu lidong 19

 Mr xu hexing 19

 如果我们将这个班级成员的数据按teacher来分区

 create table classmem(student string,age int) partitioned by(teacher string)

 分区文件

 classmem_Misli.txt

  huangfengxiao 20  

  lijie 21          

  dongdong 21  

  liqiang 21          

  hemeng 21 

 classmem_MrXu.txt

  dingding 19 

  wangqiang 19 

  lidong 19         

  hexing 19   

 LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/classmem_Misli.txt' INTO TABLE classmem partition (teacher = 'Mis.li')

 LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/classmem_MrXu.txt' INTO TABLE classmem partition (teacher = 'Mis.Xu')

 

 #分区列被默认到最后一列

 hive> select * from classmem where teacher = 'Mr.Xu';

 OK

 dingding        19      NULL    Mr.Xu

 wangqiang       19      NULL    Mr.Xu

 lidong  19              NULL    Mr.Xu

 hexing  19      NULL    Mr.Xu

 Time taken: 0.196 seconds

 #直接从分区检索,加速;如果where子句的条件不是分区列,那么,这个sql将被编译成mapreduce程序,延时很大。

 #所以,我们建立分区,是为了一些常用的筛选查询字段而用的。

#桶的使用?更高效!可取样!主要用于大数据集的取样

 桶的原理是对一个表(或者分区)进行切片,选择被切片的字段,设定桶的个数,用字段与个数的hash值进行入桶。

 比如bucket.txt数据文件内容如下:

 id name age

 1 huang 11

 2 li 11

 3 xu 12

 4 zhong 14

 5 hu 15

 6 liqiang 17

 7 zhonghua 19

 如果我们想将这个数据表切成3个桶,切片字段为id

 那么用id字段hash后,3个桶的内容如下:

 桶id hash 3 =0

 3 xu 12

 6 liqiang 17

 桶id hash 3 =1

 1 huang 11

 4 zhong 14

 7 zhonghua 19

 桶id hash 3 =2

 2 li 11

 5 hu 15

 这个过程的创建表语句如下:

 create table bucketmem (id int,name string,age int) CLUSTERED BY (id) sorted by (id asc) into 3 buckets

 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

LOAD DATA LOCAL INPATH '/home/hadoop/hfxdoc/bucketmem.txt' INTO TABLE bucketmem;

 select * from bucketmem tablesample(bucket 1 out of 4)

#其他操作参考,更完整的请参考官网: https://cwiki.apache.org/confluence/display/Hive/Home

 1) 创建与已知表相同结构的表Like:

 只复制表的结构,而不复制表的内容。

 create table test_like_table like test_bucket;

2) 对表进行重命名 rename to:

 ALTER TABLE table_name RENAME TO new_table_name

3) 增加分区 Add Partitions:

 ALTER TABLE table_name ADD partition_spec [ LOCATION 'location1' ]partition_spec [ LOCATION 'location2' ]

4) 对表中的某一列进行修改,包括列的名称/列的数据类型/列的位置/列的注释

 ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type[COMMENT col_comment] [FIRST|AFTER column_name]

5) 添加/替换列Add/ReplaceColumns

 ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENTcol_comment], ...)

 ADD COLUMNS 允许用户在当前列的末尾增加新的列,但是在分区列之前。

6) 创建表的完整语句:

 Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name 

 [(col_name data_type [COMMENT col_comment], ...)] 

 [COMMENT table_comment] 

 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 

 [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)]INTO num_buckets BUCKETS] 

 [ROW FORMAT row_format] 

 [STORED AS file_format] 

 [LOCATION hdfs_path]

 

 7) 在hive中查看hdfs文件

 >dfs -ls /user;

Hive操作语句实例讲解(帮助你了解 桶 bucket)的更多相关文章

  1. hive操作语句使用详解

    #创建表人信息表  person(String name,int age) hive> create table person(name STRING,age INT)ROW FORMAT DE ...

  2. hive操作语句

    设置属性: //设置本地执行作set hive.exec.mode.local.auto=true; //设置动态分区 set hive.exec.dynamic.partition=true; se ...

  3. [转]MongoDB更新操作replaceOne()实例讲解

    最近正在学习MongoDB,作为数据库的学习当然是要从CRUD开始学起了.这篇文章默认读者是知道如何安装MongoDB.如何运行MongoDB实例以及了解了MongoDB中的collection.do ...

  4. 2.4 hive创建表实例讲解

    一.create table ## 员工表 create table IF NOT EXISTS default.emp( empno int, ename string, job string, m ...

  5. 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式

    1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...

  6. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  7. 由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考

    背景   我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的 ...

  8. 实例讲解基于 React+Redux 的前端开发流程

    原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...

  9. Android进阶(二十三)Android开发过程之实例讲解

    Android开发过程之实例讲解 前言 回过头来审视之前做过的Android项目,发觉自己重新开发时忽然间不知所措了,间隔了太长时间没有开发导致自己的Android技能知识急剧下降.温故而知新. 废话 ...

随机推荐

  1. 利用JAVA多线程来提高数据处理效率

    肿瘤大数据挖掘中经常需要处理上百亿行的文本文件,这些文件往往高达数百GB,假如文件结构简单统一,那么用sed和awk 处理是非常方便和快速的.但有时候会遇到逻辑较为复杂的处理流程,这样我一般会用JAV ...

  2. UCSC下载ENCODE数据

    ENCODE数据库用于存放基因组原件,所有的测序数据(原始数据以及每一步处理后的数据以及最终的结果)都是开放下载的.假如说去官网下载的话会比较麻烦,这里可以通过UCSC的数据库下载(真的是神器啊)!下 ...

  3. Node.js 集群

    稳定性: 2 - 不稳定 单个 Node 实例运行在一个线程中.为了更好的利用多核系统的能力,可以启动 Node 集群来处理负载. 在集群模块里很容易就能创建一个共享所有服务器接口的进程. var c ...

  4. Android Design Support Library使用详解——TextInputLayout与TextInputEditText

    TextInputLayout 在谷歌的Material Design中,文本输入是这样表现的:当用户点击输入框想要输入文字时,如果输入框是空的,那么它的提示文字(hint)就会变小并且同时移动到输入 ...

  5. 高仿腾讯QQ最终版

    之前写过一篇关于高仿腾讯QQ的博客,不知道的看这:http://blog.csdn.net/htq__/article/details/51840273 ,主要是从界面上高仿了腾讯QQ,在UI上基本上 ...

  6. 周口网视界易付点卡销售平台招商中 www.zkpay.cn 欢迎各界朋友加盟合作。

    周口网视界易付点卡销售平台针对全国各地网吧及游戏点卡代理招商中. http://www.zkpay.cn   腾讯新的游戏点卡销售平台,平台价优稳定,这个是老家朋友开的公司,欢迎全国各地网吧客户及游戏 ...

  7. APP中一种在Java层实现的简单守护进程方式

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52779986 守护进程是一个黑色 ...

  8. Windows安装和使用fftw

    FFTW是一个比较快的.非常出名的一个DFT的开源库. 本文探索安装和配置FFTW,用Visual Studio 2008来使用fftw. 第一步:下载最新的fftw库 这一步很简单,只要在googl ...

  9. ROS_Kinetic_x 基於ROS和Gazebo的RoboCup中型組仿真系統(多機器人協作)

    國防科學技術大學發布了RoboCup中型組仿真平臺,基於ROS和Gazebo設計. 該平臺可以用於多機器人協作研究.參考資料如下: ROS新聞:1    http://www.ros.org/news ...

  10. Android View框架总结(一)

    View和Activity的区别 View有哪些? ViewGroup是什么? 为什么Google产生ViewGroup? View的层级结构是什么? View的onMeasure()/onLayou ...