文章目录

  • 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基本操作相关推荐

  1. 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 ...

  2. hive基本操作与应用

    通过hadoop上的hive完成WordCount 启动hadoop ssh localhost cd /usr/local/hadoop ./sbin/start-dfs.sh cd /usr/lo ...

  3. hive 时间转字符串_2. HIVE 基本操作

    2.1 create table 2.1.1 总述 l CREATE TABLE 创建一个指定名字的表.如果相同名字的表已经存在,则抛出异常:用户可以用 IF NOT EXIST 选项来忽略这个异常. ...

  4. hive(2)——hive基本操作

    前提:开启hadoop,关闭safe模式(关闭safe模式命令:hdfs dfsadmin -safemode leave) (1)创建一个数据库hive_test (2)切换到hive_test ( ...

  5. Hive基本操作入门

    规则语法 大小写规则: 1. hive的数据库名.表名都不区分大小写 2. 建议关键字大写 命名规则: 1. 名字不能使用数字开头 2. 不能使用关键字 3. 尽量不使用特殊符号 库操作语法 创建数据 ...

  6. 【Hive】Hive基本操作

    文章目录 1.创建DataBase 2.查看DataBase相关信息 3.删除DataBase 4.Hive表操作 4.1 创建一个名为cat的表,有两个字段,cat_id,cat_name类型为st ...

  7. 大数据----Hive学习(6)----Hive 基本操作4

    文章目录 函数 1 系统内置函数 2 常用内置函数 2.1 空字段赋值 2.2 CASE WHEN THEN ELSE END 2.3 行转列 2.4 列转行 2.5 窗口函数(开窗函数) 2.6 R ...

  8. 【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. ...

  9. Hive体系结构(三)元数据库与基本操作

    Hive体系结构(一)架构与基本组成 Hive体系结构(二)Hive的执行原理.与关系型数据库的比较 Hive体系结构(三)元数据库与基本操作 Hive体系结构(四)注意事项与扩展特性 1. Hive ...

  10. Hive的基本操作总结

    文章目录 目录 前言: 1.Hive基本操作 1.1.DDL操作 1.2.DML操作 1.3.Hive Join 总结: 目录 前言: 对于Hive来说最重要的一点就是能够用Hql来进行数据分析.而H ...

最新文章

  1. 动态规划入门 洛谷P1108 低价购买
  2. 华为定制版Linux镜像下载,华为OpenEuler体验系列(02)--定制支持NTFS的微型Linux启动盘...
  3. ArcGIS实验教程——实验三十九:ArcGIS多元分类(ISO聚类分析、最大似然分类、主成分分析)案例教程
  4. 新的学期、新的开始、新的付出、新的收获!
  5. ElasticSearch 复合查询
  6. ubuntu 开机黑屏
  7. Grunt构建工具能做哪些事?
  8. ViewPager PagerAdapter未更新视图
  9. 华为透露成长秘诀:信息化建设铸就发展奇迹
  10. 超详细的四类数据库去重实现方案汇总(转载)
  11. 【2023秋招】网易雷火游戏研发工程师笔试
  12. 为什么会有这么多种Python?
  13. 图片随着屏幕大小变化而变化
  14. appinventor计算机教程,App Inventor编程开发集锦2-计算器-第2课-实现常规操作
  15. 处理器后面的字母含义_CPU后面的数字和字母都是什么意思?全面解答。
  16. 速率法和终点法的区别_速率法,终点法
  17. 这么久了,深爱的人,还好吗?
  18. php生成免签转账码,(转)支付宝免签二维收款码生成
  19. 简易画图工具(Python)
  20. mybatis开启二级缓存

热门文章

  1. 翻译app上的图片文字信息提取好神奇?如何实现一个文字图片识别程序
  2. 企业管理软件从勤哲excel服务器迁移到奥多odoo的感触
  3. 一文搞懂PMO如何推动流程规范的落地及常见问题如何解决?【管理有度4】
  4. html页面解析 成dom树,将网页解析成dom树的几种方法
  5. [Java教程]21.静态-static
  6. Oracle锁表解决方法的详细记录详解
  7. 春季高考计算机专业知识归纳,春季高考计算机试题总结.doc
  8. hadoop 四种压缩格式
  9. Elasticsearch索引别名alias操作
  10. debounce与throttle区别