hive的基本操作

hive的使用方式

1.使用CLI

直接使用hive命令即可进入客户端。

2. 使用hiveserver2服务

  1. 修改hdfs-site.xml,core-site.xml
    • 在hdfs-site.xml加上dsf.webhdfs.enabled-->true
    • core-site.xml加入hadoop.proxyuser.hadoop.hosts-->*
      ......groups-->*
  2. 把hive启动为一个后台服务,只有启动为后台服务之后,才能让HJDBC,ODBC等程序去连接hive
  • nohup command &
    nohup 的意思: no hang up 不挂起
    输入命令:nohup hiverser2 & 2>~/hive_err.log 1>~/hive_std.log
    日志:0代表标准输入,1代表标准输出,2代表异常输出
    nohup hiverser2 & 2>/dev/null 1>/dev/null
    进入黑洞,所有日志都不保存
    输入jps 出现 RunJar进程表示启动成功

  • 使用beeline客户端工具去连接hiveserver2

    1. $ beeline
    2. >!connect jdbc:hive2://hadoop02:10000

HQL的使用

关于库的DDL

  1. 创建库
    create database if not exists hadoop;
    创建时使用if not exists 忽略异常
    删除时,使用 if exists 忽略异常
    适用于创建表

  2. 查询库列表信息
    show databases;

  3. 查询正在使用的库
    select current_database();

  4. 切换库
    use dname;

  5. 查询库的详细信息
    desc database dname;
    desc database extended dname;

  6. 删除库
    drop database dname;
    drop database dname restrict;
    如果已经有表是不能删除的。
    drop database dname cascade;
    级联的方式删除数据库

  7. 修改库/基本不用

关于表的DDL

  1. 创建表
    create
  • comment 表注释

  • partioner by(col_name data_type...)
    分区字段不能在表字段中出现

  • clustered by (col_name,....) 分桶
    [sorted by (col_name[asc|desc],...)]是否排序按照哪个字段排序
    into num_buckets BUCKETS 整个表分成多少个桶
    分桶表的字段必须是表字段中的一部分

  • row format row_format 行的分隔符以什么字符终止
    row format delimited fields terminated by "," lines terminated by "\n"

  • stored as file_format 存储什么文件
    file_format:

    1. textfile 普通文本
    2. sequencefile 序列化文本
    3. rcfile行列存储相结合的文件
    4. 自定义文件格式
  • location hdfs_path
    创建表的时候可以指定表的路径。
    内外部表都是可以指定hdfs的存储路径的。
    最佳实践是:如果一份数据已经存储在hdfs上并且要让多个客户端使用,就用外部表。

  • set hive.exec.mode.local.auto=true;
    hive尝试本地模式运行
    会话断或者reset就自动失效;

  • 复制表
    create table student_1 like student;
    复制一张表的定义,不包含数据

  • CTAS
    create table .... as select ...

  • set property
    查看配置文件

6个表DDL的例子
  • 创建内部表:create table student (id int, name string) row format delimited fields terminated by ',';

  • 创建外部表: create external studen_ext row format delimited fields terminated by ',' location '/hive/student';
    desc 表名就可以看到表结构是externaltable

  • 分区表:
    create table student_ptn(id int , name string) partitioned by (city string) row format delimited fields terminated by ','

    create table t01_ptn02 (count int) partitioned by (username string,month string) row format delimited fields terminated by ',';

    添加分区:alter table student_ptn add partition(city="beijing")

    city 是分区字段,如果有还有如zip那目录结构就是/city=beijing/zip=10011

    分区字段不能使用表中存在的字段
    如果某张表是分区表,某个分区就是这张表目录下的一个分区目录
    数据文件只能放在分区文件夹中,不能放在表文件夹下。

    查看分区: show partitions student_ptn;

  • 分桶表
    create table studen_bck (id int , name string) clustered by (id) sorted by (id asc,name desc) into 4 buckets row format delimited fields terminated by ','

  • 使用CTAS创建表
    就是从一个查询sql结果来创建一个表进行存储
    create table studnet_ctas as select * from student where id <10;

  • 复制表结构
    create table sut_copy like student;

    无论被复制的表是内部表还是外部表,如果在table的前面没有加exteral那么复制出来的新表都是内部表

查看命令

show tables;
show tables in dname;
show tables like 'stu*';//使用正则表达式

  • 查看表的详细信息
    desc studnet;
    desc extended student;
    desc formatted student;
    show partitions stu; //查看分区信息

  • show functions;//查看函数

  • desc function extended substring;//查看函数用法

  • show create table stu;//查看建表的详细语句

修改表
  1. 修改表名
    alter table stu rename to new_stu;

  2. 修改字段定义

    • 增加一个字段
      alter table stu **add columns **(sex string,age int);
    • 修改一个字段定义
      alter talbe stu change age new_age string;
    • 删除一个字段
      不支持
    • 替换所有字段
      alter table stu replace columns(id int,name string);
      int类型可以转成string,string转不成int
      但hive-1.2.2版本可以任意替换
      hive schema on read //hive是读模式的数据仓库
    • 修改分区信息
      • 添加静态分区:alter table stu_ptn add partioner(city="chongqing") partioner(city="kunming") ......;

      • 修改分区
        一般来说只会修改分区数据的存储目录alter table stu_ptn partioner(city='beijing') set location '/stu_ptn_beijing';

      • 删除分区
        alter table stu_ptn drop partition (city='beijing')

  3. 清空表
    truncate table stu;

  4. 删除表
    drop table stu;

DML数据操纵语言

导入数据

  1. load方式装载数据
    hive模式是读模式,可以导入任何数据
    • load data local inpath "/home/" into table student;
      从Linux本地导入数据到student表中。
      会把数据文件上传进/user/hive/warehouse/student

    • load data inpath "/stu/test.txt" into table stu;
      从hdfs上导入数据
      如果数据已经在hdfs上,就不要再创建内部表。
      因为这样会把这份数据移动到/user/hive/warehouse/目录下
      内部表删除时就会把这份数据删掉。

    • hadoop fs -put file user/hive/warehouse/studnet/
      直接上传到上传到hive表中

    • load data local inpath "....." overwrite into talbe;
      覆盖导入

  2. inser 方式插入数据
    • insert into student (id,name,sex,age,department)values(1111,'ss','f',12,'nn'),(xx,xxx,xxx,);
      insert方式,首先创建一张零时表如values_tmp_table_1 来保存inser语句的结果,然后再将记录插入到表中
    • insert into table student_c select *from student where age<=18;
多重插入
  1. 创建一张分区表create table stu_ptn_age(id int,name string, sex String )partioned by (age int).....
  2. 从stu表中,把数据分成三类,插入到stu_ptn这张表的三个分区中:
    导入数据到分区表时,这个分区可以不存在。会自动创建
    insert into table  stu_ptn_age partition(age=18) select id,name,sex,department from student where age <=18;
    insert into table  stu_ptn_age partition(age=19) select id,name,sex,department from student where age =19;
    insert into table  stu_ptn_age partition(age=20) select  id,name,sex,department from student where age >=20;
    
    这种方式比较耗时
  • 可以使用多重插入来降低任务复杂度
    主要减少的是原表的数据扫描次数

      from sudent
      insert into table stu_ptn_age partition(age=18) select id,name,sex,department where age<=18 ;
      insert into table stu_ptn_age partition(age=19) select id,name,sex,department where=19;
      insert into table stu_ptn_age partition(age=20) select id,name,sex,department where >=20;
    
  • 清空表truncate时不会清空age=xx的分区信息

  • select * from stu_ptn;
    分区字段也会显示。
    在使用过程中分区字段和普通字段是一样的。

  • 分区的信息存储在partition表中

问题: 如果真实的需求是每一个年龄一个分区?
动态分区插入
  1. 创建一张测试表:create stu_ptn_dpt .....partition by (department string)....
  2. 插入数据会报错:insert into table t01_ptn partition(username,month) select count,username,month from table01;
  3. set hive.exec.dynamic.partition.mode=nonstrict
    如果一张表有多个分区字段:那么在进行动态分区插入是,一定要有一列是静态分区;如果不像受这样的限制就把模式设置为nonstrict。
  • 如果往分区表中插入数据,不要使用load方式,这容易使分区内的数据混乱,除非在非常确定的情况下
  1. insert方式导出数据
    insert overwrite local directory "/home/hadoop/tem/stu_le18" select * from student where age<=18;
    这种方式要注意路径,因为是overwriter
    在查看到处数据时使用:sed -e 's/\x01/\t/g' file.txt 替换默认的Ctrl+a字段分隔符。
字符串替换:s命令
sed 's/hello/hi/g' sed.txt              
##  在整行范围内把hello替换为hi。如果没有g标记,则只有每行第一个匹配的hello被替换成hi。

多点编辑:e命令
sed -e '1,5d' -e 's/hello/hi/' sed.txt
##  (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用hello替换hi。
命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

sed --expression='s/hello/hi/' --expression='/today/d' sed.txt
##  一个比-e更好的命令是--expression。它能给sed表达式赋值。

查询

  1. distinct去重

  2. show function;271个内置函数--2.3.3
    UDF 单行函数,输入1,输出1;
    UDAF 多对一函数,输入n 输出1
    UDTF 一对多函数 输入1,输出n

  3. 不支持update和delete
    因为是hive是数据仓库,联机事务分析

  4. 支持in 和 exits
    select * from student where in (18,19)
    老版本不支持,hive推荐使用semi join半连接

  5. 支持 case when

select id,t_job,t_edu **case** t_edu 
when "硕士" then 1 
when "本科" then 2 
else 3 
end as level 
from lagou limit 1,100;

select count(distinct age )from join .. on ..where ... goup by ... having ... cluster by ...distribute by ..sort by .. order by ... limit ....

  1. order by 全局排序 select * from studnet order by age desc

  2. sort by
    局部排序,每个分区内有序,但是你会发现同一个age的条目会被分到不同分区中,因为没有进行hash散列。
    一个sql就是一个mr程序,局部排序就是指,有多个reduceTask执行的话,那么最终,每个reduceTask的结果是有序的,如果只有一个reduceTask sort by = order by
    set mapreduce.job.reduces =3;
    select * from student sort by age desc;
    如果使用* 号查询出来的是随机进行分区的。

  3. distribute by
    分桶操作
    select * from student distribute by age sort by age desc;
    分桶就是把age求hash值之后模以桶数得到的结果就知道要分到哪个桶中,分桶的个数就是reduceTask的个数。
    sort by是进行局部排序,所以每个桶中的数据是有序的

  4. cluster by
    cluster by age = distribute by age sort by age;
    distribute by id sort by id,age != cluster by id sort by age;
    cluster by 不能和sort by 同用。
    如果要散列一个字段之后进行多个分区的排序只能用distributed和sort组合。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容