004-hive基本操作
文章目录
- hive 基本操作
- 1、数据库的基本操作
- 2、表的操作
- 3、表的其他操作
- 4、hive导入数据
- 5、hive 导出数据
hive 基本操作
1、数据库的基本操作
1)默认的数据库是 default
2)创建数据库:create database hivedb comment 'I am hive database';完整格式:create database|schema[if not exists] database_name[comment database_comment][location hdfs_path][with dbproperties (property_name=property_value, ...)]; 设置一些属性创建数据库使用 database 或 schema 都可以;if not exists:判断数据库是否存在;comment:数据库注释;location hdfs_path:指定数据库在 hdfs 上的目录,默认/user/hive/warehouse/database_name;with dbproperties (property_name=property_value, ...):设置一些属性例:create database hivetestdb;# 创建数据库,Hive会在/user/hive/warehouse/下创建一个以database_name.db命名的目录(如:/user/hive/warehouse/hivetestdb.db)
3)查看所有数据库:show databases;
4)查看指定数据库:desc database database_name;
5)查看指定数据库详细信息:desc database extended database_name;
6)查看当前数据库:select current_database();
7)切换数据库:use database_name;
8)删除空数据库:drop database database_name;级联删除数据库(包括表):drop database database_name cascade;删除数据库完善格式:drop database if exists database_name cascade;
2、表的操作
操作 hive 表时,最好在前面加上数据库名
1)创建表:create database auser(id int comment 'I am id',name varchar(30));创建表时指定分隔符:create database auser(id int comment 'I am id',name varchar(30)) [row format delimited fields terminated by '\t'];创建带分区的表:CREATE TABLE tab01 (id int,name string) PARTITIONED BY (ds string);不指定 database 时,默认创建在 default 数据库中;说明:在 hivetestdb 中创建表 auth_user,hive 会在 /user/hive/warehouse/hivetestdb.db 下创建 auth_user 目录。
2)查看表数据:select * from table_name;
3)查看当前库所有表:show tables;
4)查看建表语句:show create table table_name;
5)查看一个表的分区:show partition table_name;如果这个表不存在分区则会报错
6)查看表结构(包括注释):describe table_name 或 desc table_name 或 desc formatted table_name;例:describe extended utab2;输出:Table(tableName : utab2,dbName : default,owner : root,createTime : 1537504392,lastAccessTime : 0,retention : 0,sd : StorageDescriptor(cols : [FieldSchema(name : id,type : int,comment : null),FieldSchema(name : uname,type : string,comment : null),FieldSchema(name : age,type : int,comment : null)],location : hdfs://localhost:9000/user/hive/warehouse/utab2,inputFormat : org.apache.hadoop.mapred.TextInputFormat,outputFormat : org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat,compressed : false,numBuckets : -1,serdeInfo : SerDeInfo(name : null,serializationLib : org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe,parameters : {serialization.format=1}),bucketCols : [],sortCols : [],parameters : {},skewedInfo : SkewedInfo(skewedColNames : [],skewedColValues : [],skewedColValueLocationMaps : {}),storedAsSubDirectories : false),partitionKeys : [],parameters : {totalSize=8,numRows=1,rawDataSize=7,COLUMN_STATS_ACCURATE={\"BASIC_STATS\" : \"true\",\"COLUMN_STATS\" : {\"age\" : \"true\",\"id\" : \"true\",\"uname\" : \"true\"}},numFiles=1,transient_lastDdlTime=1537505000,bucketing_version=2},viewOriginalText : null,viewExpandedText : null,tableType : MANAGED_TABLE,rewriteEnabled : false,catName : hive,ownerType : USER)
7)查看表详细信息:describe extended table_name;
8)修改表a. 修改表名:alter table table_name rename to new_table_name;b. 修改 location:alter table table_name set location 'hdfs://nameservice1/data/test';c. 修改表属性(如编码):alter table table_name set serdeproperties('serialization.encoding'='GBK');d. 添加列:alter table table_name add columns (age int comment 'this is age');e. 使用新字段覆盖表原所有字段:alter table table_name replace columns (age string comment 'only keep the column');
9)删除和清空表a. 删除表:drop table [if exists] table_name;b. 清空表:truncate table table_name;注意:》truncate table student; 只能对管理表使用,不能对外部表使用》truncate 命令操作时表名前不能加上database_name》外部表 drop 之后,数据表在hdfs上目录的数据文件依然存在,实际是只删除了保存在关系型数据库中的元数据》管理表 truncate 之后,数据表location 所在目录的数据文件删除,目录依然存在。管理表 drop 之后,数据表location 所在目录删除。删除了元数据和数据文件,数据目录。
10)插入数据a. 单表插入insert overwrite table tab09 select a.* from tab03 a;insert overwrite table tab09 select 7,'cat';insert into table auth_user values (4,'kitty');说明:overwrite 是覆盖,into 是追加。b. 多表插入(Multi Table/File Inserts)FROM srcINSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100INSERT OVERWRITE 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 WHERE src.key >= 300;FROM pv_usersINSERT OVERWRITE TABLE pv_gender_sum SELECT pv_users.gender, count_distinct(pv_users.userid) GROUP BY pv_users.genderINSERT OVERWRITE DIRECTORY '/user/data/tmp/pv_age_sum' SELECT pv_users.age, count_distinct(pv_users.userid) GROUP BY pv_users.age; 【Dynamic-Partition Insert -- version 0.6.0 后增加的新特征】FROM page_view_stg pvsINSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='US')SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'US'INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='CA')SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'CA'INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='UK')SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'UK';上面这个语句,是一个非常不好的示例,因为我们预先需要知道所有的 country,并且 dt 如果变了,那么我们需要重新增加新的 insert 语句。例如,当还有另外一个 country='DC' 或者 dt = '2008-09-10'Dynamic-partition insert 是为了解决上述问题而被设计的。所以 Dynamic-partition insert 如下即可FROM page_view_stg pvsINSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country)SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.country说明:上述示例语句中,dt 是一个静态分区列(因为它的值一直都是2008-06-08,没有任何变化),country 是动态分区列。动态分区列的值来自输入列。目前,只允许动态分区列作为分区子句中的最后一列(s),因为分区列顺序表示它的层次顺序,所以不能用(dt, country='US')来指定分区子句。select 语句中额外增加的 pvs.country 列,是动态分区列对应的输入列。请注意,您不需要为静态分区列添加一个输入列,因为它的值已经在隔断子句中知道了。注意,动态分区值是通过排序、而不是名称来选择的,并作为select子句的最后一列来选择。(即动态分区列的值是来自 select 子句的最后一列,而不通过名字匹配的)动态分区插入语句的语义:当动态分区列已经存在非空分区时(例如,在某些ds根分区之下存在着country='CA'),如果动态分区插入在输入数据中看到相同的值(比如'CA'),就会被覆盖。因为 Hive 分区对应于HDFS中的一个目录,所以分区值必须符合HDFS路径格式。任何在URI中具有特殊含义的字符(例如,'%', ':', '/', '#')都将以'%'的形式转义,后跟2字节的ASCII值。如果输入列是非字符串的类型,那么它的值将首先被转换成字符串,用于构造HDFS路径。如果输入列值为NULL或空字符串,这一行将被放入一个特殊的分区中,该分区的名称由hive参数hive.exec.default.default.name控制。默认值是HIVE_DEFAULT_PARTITION{}。基本上这个分区将包含所有的“坏”行,它们的值不是有效的分区名称。这种方法的警告是,如果您选择Hive,那么它将丢失并被HIVE_DEFAULT_PARTITION{}所取代。JIRA hia-1309是一个解决方案,让用户指定“坏文件”来保留输入分区列值。动态分区插入可能是一个资源占用者,因为它可以在短时间内生成大量的分区。为了让自己分桶,我们定义了三个参数:hive.exec.max.dynamic.partitions.pernode:(默认值是1000)是每个mapper或reducer可以创建的最大动态分区数。如果一个mapper或reducer创建的比这个阈值更多,那么将会从map/reducer(通过计数器)中产生一个致命的错误,整个job将被杀死。hive.exec.max.dynamic.partitions:(默认值是100)能够被一个DML创建的动态分区的总数。如果每一个mapper/reducer都没有超过限制,但是动态分区的总数是超过了,那么在将中间数据移动到最终目的地之前,将会抛出一个异常结束 job。hive.exec.max.created.files:(默认值是100000)是所有的mapper和reducer创建的最大的文件总数。每一个mapper/reducer 创建一个新文件时将执行 Hadoop counter 更新。如果总数超过了hive.exec.max.created.files,将抛出一个致命的错误,job 将被杀死。我们想要保护不利于动态分区插入的另一种情况是,用户可能意外地指定所有分区为动态分区,而不指定一个静态分区,虽然最初的目的是想覆盖一个根分区的子分区。我们可以定义另外一个参数 hive.exec.dynamic.partition.mode=strict 来保护这种全动态分区情况。在严格模式下,您必须指定至少一个静态分区。默认模式是严格的。另外,我们可以用一个参数 hive.exec.dynamic.partition=true/false 来控制是否允许动态分区。在Hive 0.9.0之前默认值是false,在Hive 0.9.0和之后默认值是 true。 在Hive 0.6中,hive.merge.mapfiles=true or hive.merge.mapredfiles=true时动态分区插入不工作。所以它内部关闭了merge 参数。在Hive 0.7中 merging file 是支持动态分区插入的(详见JIRA hi1307)。
3、表的其他操作
1)group byCREATE TABLE tab10 (name string) row format delimited fields terminated by '\t';a. select 语句为常规 sqlINSERT OVERWRITE TABLE tab10 SELECT a.name FROM tab09 a GROUP BY a.name;b. from 写到了 select 的前面FROM tab09 a INSERT OVERWRITE TABLE tab10 SELECT a.name GROUP BY a.name;2)AggregationsINSERT OVERWRITE TABLE pv_gender_sum SELECT pv_users.gender, count(DISTINCT pv_users.userid) FROM pv_users GROUP BY pv_users.gender;INSERT OVERWRITE TABLE pv_gender_agg SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(*), sum(DISTINCT pv_users.userid) FROM pv_users GROUP BY pv_users.gender;3)joinsa. joinFROM tab001 t1 JOIN tab002 t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE tab003 SELECT t1.bar, t1.foo, t2.foo;INSERT OVERWRITE TABLE pv_users SELECT pv.*, u.gender, u.age FROM user u JOIN page_view pv ON (pv.userid = u.id) WHERE pv.date = '2008-03-03';b. LEFT OUTER, RIGHT OUTER or FULL OUTER,外部连接INSERT OVERWRITE TABLE pv_users SELECT pv.*, u.gender, u.age FROM user u FULL OUTER JOIN page_view pv ON (pv.userid = u.id) WHERE pv.date = '2008-03-03';c. LEFT SEMI JOIN,为了检查另一张表中的键的存在,用户可以使用左半连接,如下面的例子所示INSERT OVERWRITE TABLE pv_users SELECT u.* FROM user u LEFT SEMI JOIN page_view pv ON (pv.userid = u.id) WHERE pv.date = '2008-03-03';d. 多表连接INSERT OVERWRITE TABLE pv_friends SELECT pv.*, u.gender, u.age, f.friends FROM page_view pv JOIN user u ON (pv.userid = u.id) JOIN friend_list f ON (u.id = f.uid) WHERE pv.date = '2008-03-03';4)Sampling -- 抽样从pv_gender_sum的32个桶中选择第三个桶INSERT OVERWRITE TABLE pv_gender_sum_sample SELECT pv_gender_sum.* FROM pv_gender_sum TABLESAMPLE(BUCKET 3 OUT OF 32);5)Union AllINSERT OVERWRITE TABLE actions_usersSELECT u.id, actions.dateFROM (SELECT av.uid AS uidFROM action_video avWHERE av.date = '2008-06-03'UNION ALLSELECT ac.uid AS uidFROM action_comment acWHERE ac.date = '2008-06-03') actions JOIN users u ON(u.id = actions.uid);6)Custom Map/Reduce Scripts -- 自定义 Map/Reduce 脚本https://cwiki.apache.org/confluence/display/Hive/Tutorial#Tutorial-BuiltInOperatorsandFunctionsFROM (FROM pv_usersMAP pv_users.userid, pv_users.dateUSING 'map_script'AS dt, uidCLUSTER BY dt) map_outputINSERT OVERWRITE TABLE pv_users_reducedREDUCE map_output.dt, map_output.uidUSING 'reduce_script'AS date, count;7)streamingFROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
4、hive导入数据
1)table --> tablea. 导入其他表数据insert overwrite|into table table_name select * from table_name2;b. 创建表时导入其他表数据create table table_name as select * from table_name2;c. 创建表时指定 location,并导入其他表数据注意:创建表指定 location 导入数据时必须是不存在的目录,不然创建表会失败。可以先创建表,再删除相应的目录,再将数据上传到对应的目录。表就可以直接加载出数据。2)file --> table 将文件内容导入到表中(表所有目录)load data [local] inpath '/tmp/students.txt' [overwrite] into table table_name [partition(part1='value1',part2='value2',...)]; 示例1:load data local inpath '/tmp/students.txt' overwrite into table tab03;说明:local 表示加载本地数据;不使用 local 时,表示加载 HDFS 上的数据。加上 overwrite 表示覆盖,不加 overwrite 表示追加。inpath 是加载的数据的目录,一般写全路径。可以指定到文件,也可以直接指定目录,指定目录会加载目录下所有文件的数据。partition:向分区表中导入数据。示例2:# local 用于指定本地文件,如果缺省了,则会在 HDFS 中查找文件;OVERWRITE 表示覆盖,如果缺省则表示添加load data local inpath '/tmp/students.txt' overwrite into table tab03;# students.txt 内容为id name1 'zhangsan'2 'lisi'3 wangwu# select * from tab03;NULL name1 'zhangsan'2 'lisi'3 wangwu上面为 NULL 是因为第一列类型为 int示例3:CREATE TABLE tab07 (id int,name string) PARTITIONED BY (ds string) row format delimited fields terminated by '\t';load data local inpath '/tmp/students.txt' overwrite into table tab07 PARTITION (ds='2008-08-15');# students.txt1 'zhangsan'2 'lisi'3 wangwu4 tom5 cat6 kittyselect * from tab07;1 'zhangsan' 2008-08-152 'lisi' 2008-08-153 wangwu 2008-08-154 tom 2008-08-155 cat 2008-08-156 kitty 2008-08-15
5、hive 导出数据
1)table --> fileinsert overwrite|into [local] directory '/temp/students.txt' [row format delimited fields terminated by '\t'] select * from table_name 示例:# 往 HDFS 里写数据insert overwrite directory '/tmp/students.txt' select * from tab07 t where t.ds = '2008-08-15';# 往本地文件里写数据insert overwrite local directory '/tmp/students5' select a.* from tab03 a;insert overwrite local directory '/tmp/students6' select * from tab07 t where t.ds = '2008-08-15';
参考地址:
https://cwiki.apache.org/confluence/display/Hive/Tutorial
https://www.cnblogs.com/johnny-YJL/p/7940594.html
004-hive基本操作相关推荐
- Hive基本操作,DDL操作(创建表,修改表,显示命令),DML操作(Load Insert Select),Hive Join,Hive Shell参数(内置运算符、内置函数)等
1. Hive基本操作 1.1DDL操作 1.1.1 创建表 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_nam ...
- hive基本操作与应用
通过hadoop上的hive完成WordCount 启动hadoop ssh localhost cd /usr/local/hadoop ./sbin/start-dfs.sh cd /usr/lo ...
- hive 时间转字符串_2. HIVE 基本操作
2.1 create table 2.1.1 总述 l CREATE TABLE 创建一个指定名字的表.如果相同名字的表已经存在,则抛出异常:用户可以用 IF NOT EXIST 选项来忽略这个异常. ...
- hive(2)——hive基本操作
前提:开启hadoop,关闭safe模式(关闭safe模式命令:hdfs dfsadmin -safemode leave) (1)创建一个数据库hive_test (2)切换到hive_test ( ...
- Hive基本操作入门
规则语法 大小写规则: 1. hive的数据库名.表名都不区分大小写 2. 建议关键字大写 命名规则: 1. 名字不能使用数字开头 2. 不能使用关键字 3. 尽量不使用特殊符号 库操作语法 创建数据 ...
- 【Hive】Hive基本操作
文章目录 1.创建DataBase 2.查看DataBase相关信息 3.删除DataBase 4.Hive表操作 4.1 创建一个名为cat的表,有两个字段,cat_id,cat_name类型为st ...
- 大数据----Hive学习(6)----Hive 基本操作4
文章目录 函数 1 系统内置函数 2 常用内置函数 2.1 空字段赋值 2.2 CASE WHEN THEN ELSE END 2.3 行转列 2.4 列转行 2.5 窗口函数(开窗函数) 2.6 R ...
- 【Hive】hive基本操作 ddl dml
文章目录 1. ddl 操作 1.1库操作 1.1.1 创建库 1.1.2 查看库 1.1.3 切换库 1.1.4 删除库 1.2 表操作 1.2.1 创建表 1.2.1.0 建表语法及解释 1.2. ...
- Hive体系结构(三)元数据库与基本操作
Hive体系结构(一)架构与基本组成 Hive体系结构(二)Hive的执行原理.与关系型数据库的比较 Hive体系结构(三)元数据库与基本操作 Hive体系结构(四)注意事项与扩展特性 1. Hive ...
- Hive的基本操作总结
文章目录 目录 前言: 1.Hive基本操作 1.1.DDL操作 1.2.DML操作 1.3.Hive Join 总结: 目录 前言: 对于Hive来说最重要的一点就是能够用Hql来进行数据分析.而H ...
最新文章
- 动态规划入门 洛谷P1108 低价购买
- 华为定制版Linux镜像下载,华为OpenEuler体验系列(02)--定制支持NTFS的微型Linux启动盘...
- ArcGIS实验教程——实验三十九:ArcGIS多元分类(ISO聚类分析、最大似然分类、主成分分析)案例教程
- 新的学期、新的开始、新的付出、新的收获!
- ElasticSearch 复合查询
- ubuntu 开机黑屏
- Grunt构建工具能做哪些事?
- ViewPager PagerAdapter未更新视图
- 华为透露成长秘诀:信息化建设铸就发展奇迹
- 超详细的四类数据库去重实现方案汇总(转载)
- 【2023秋招】网易雷火游戏研发工程师笔试
- 为什么会有这么多种Python?
- 图片随着屏幕大小变化而变化
- appinventor计算机教程,App Inventor编程开发集锦2-计算器-第2课-实现常规操作
- 处理器后面的字母含义_CPU后面的数字和字母都是什么意思?全面解答。
- 速率法和终点法的区别_速率法,终点法
- 这么久了,深爱的人,还好吗?
- php生成免签转账码,(转)支付宝免签二维收款码生成
- 简易画图工具(Python)
- mybatis开启二级缓存