大数据hadoop生态体系之Hive的基本操作(15)

Hive数据仓库基于shell命令行基本操作(DDL/DML):

首先启动hive数据库仓库的shell脚本模式:

命令:/opt/mysoft/hive/bin/hive

1> 查看当前Hive中有哪些数据库

     hive初始化后,会生成一个默认的default数据库;往往根据项目不同,会建立不同业务的hive数据库;

     命令:show databases;

2> 创建数据库

     命令:create database test;     

3> 打开/使用数据库

     命令:use test;

4> 查看数据库中的所有表

     命令:show tables;

5> 基于打开的数据库建表

     命令:create table stu (id int,name string)  row format delimited fields terminated by ',';

     查看创建成功后的表结构:

     命令:desc stu;

6> 加载数据到表中

     本地文件方式:

     命令:load data local inpath '/opt/mysoft/stu.txt' into table stu;  

     HDFS远程服务器方式:

     命令:load data inpath 'hdfs://hadoop:9000/output/*' into table stu;

语法命令:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

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

   [COMMENT table_comment]

   [PARTITIONED BY (col_namedata_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]

1、 CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。

2、 EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)。

Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

3、 LIKE 允许用户复制现有的表结构,但是不复制数据。

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name LIKE existing_table;

4、 ROW FORMAT DELIMITED

[FIELDS TERMINATED BY char]

        [COLLECTION ITEMS TERMINATED BY char]

        [MAP KEYS TERMINATED BY char]

  [LINES TERMINATED BY char] | SERDE serde_name

  [WITH SERDEPROPERTIES

(property_name=property_value, property_name=property_value,...)]

hive建表的时候默认的分割符是'\001',若在建表的时候没有指明分隔符,load文件的时候文件的分隔符需要是'\001';若文件分隔符不是'001',程序不会报错,但表查询的结果会全部为'null';

用vi编辑器Ctrl+v然后Ctrl+a即可输入'\001' ----------->  ^A

SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。

Hive读取文件机制:首先调用InputFormat(默认TextInputFormat),返回一条一条记录(默认是一行对应一条记录)。然后调用SerDe(默认LazySimpleSerDe)的Deserializer,将一条记录切分为各个字段(默认'\001')。

Hive写文件机制:将Row写入文件时,主要调用OutputFormat、SerDe的Seriliazer,顺序与读取相反。

可通过desc formatted 表名;进行相关信息查看。

当我们的数据格式比较特殊的时候,可以自定义SerDe。

5、 PARTITIONED BY

在hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition分区概念。

分区表指的是在创建表时指定的partition的分区空间。一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。表和列名不区分大小写。分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。

6、 STORED AS SEQUENCEFILE|TEXTFILE|RCFILE

如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

TEXTFILE是默认的文件格式,使用DELIMITED子句来读取分隔的文件。

6、CLUSTERED BY INTO num_buckets BUCKETS

对于每一个表(table)或者分,Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

把表(或者分区)组织成桶(Bucket)有两个理由:

(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

hive cli中显示列名: 进入hive cli后 set hive.cli.print.header=true;

案例:

1> 创建普通表,字段以逗号进行分割,默认分隔符是'\001', vi 编辑器的:ctrl + v 和 ctrl+a

create table tb_stu(id int, name string) row format delimited fields terminated by ','; 

2> 创建分区表,有时候数据量太大,我们只需要查询一部分,可以使用字段分区,分区字段不能和已有的字段重复

create table tb_stu2(id int,name string) partitioned by (age int) row format delimited fields terminated by ',';

加载数据:load data local inpath '/opt/mysoft/hivedata/student.txt' INTO TABLE tb_stu2 PARTITION(age=20);

加载数据时如果添加local加载的是本地数据,如果没有local加载的是hdfs服务器上的数据。

3> 创建双分区表 使用partition(year string,hour int)

create table tb_stu3(id int,name string) partitioned by (dt string,hour string) row format delimited fields terminated by ',';

加载数据:load data local inpath '/opt/mysoft/hivedata/student.txt' into table tb_stu3 partition(dt = '20200404',hour='23');

4> 分桶表 (cluster by into num bucked )

    指定开启分桶:set hive.enforce.bucketing = true;

                              set mapreduce.job.reduces = 4;

    创建分桶表:

    create table tb_stu4(id int,name string) clustered by (id) sorted by(id desc) into 4 buckets row format delimited fields terminated by ',';

    导入数据(需要前创建一个同样字段的临时表,然后导入数据,再从临时表中查询数据导入到分桶表):

    insert overwrite table tb_stu4 select * from tb_stu cluster by (id)

    分桶表需要使用mr程序进行计算之后再装载导入到分桶表中,根据分桶字段的hash值计算分桶

5> 内部表和外部表(EXTERNAL), 主要区别在于看有没有加 external关键字,内部表在hive的默认路径下,外部表可以指定目录,特别是有比较大的数据的时候,不用上传到hive,直接在hdfs上的文件目录建立关联。

创建表: create external table tb_stu5(id int,name string) row format delimited fields terminated by ',' location '/input';

外部表当元数据表删除的时候,外部表对象应的数据文件不会被删除,内部表则元数据和表文件一块被删除。

6> like 语句: 复制一个表的表结构,但不会复制数据。

    create table stu_like like tb_stu;

7> 修改分区表:

alter table tb_stu2 partition(age = 20) rename to partition(age=50);

8> hive表的join查询:

select * from tb_stu t1 join tb_stu2 t2 on t1.id = t2.id where t1.id = 5;

9> 导出数据:

    导出到本地目录:

    insert overwrite local directory '/opt/data' select * from tb_stu;

    导出到hdfs目录:

    insert overwrite directory '/input' select * from tb_stu;

10> hive 中创建dual表

     create table dual(id string);

    在opt/mysoft/hivedata目录中创建 dual.txt 文件,文件中只保存一个空格。

    加载数据到dual表: load data local inpath '/opt/mysoft/hivedata/dual.txt' into table dual;

    测试:select substr('hello world',2,3) from dual;

11> 自定义UDF开发函数:

      hive 可以使用自定义UDF函数。

    定义步骤:使用maven创建一个java工程

    1. 导入需要的依赖jar包

        hive-exec-1.2.1.jar和hadoop-common-2.7.4.jar依赖

    2.创建一个类,继承org.apache.hadoop.hive.ql.exec.UDF类,重载evaluate()方法,实现自己的定义方法的业务逻辑

    3.打成jar包上传到服务器

    4.将jar包添加到hive的classpath

        hive>addJAR /home/hadoop/udf.jar;

    5. 创建临时函数与开发好的java class关联

        create temporary function tolowercase as 'com.hive.test.udffunc';

     6.使用自定义函数:select tolowercase('ABCDEF'); 输出结果:abcdef

        

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

推荐阅读更多精彩内容