1、hive的数据加载方式

1.1、load data

这中方式一般用于初始化的时候

  1. load data [local] inpath '...' [overwrite] into table t1 [partition(...)]
  2. -- 如果有local是从linux磁盘加载,如果没带local是从hdfs的某个目录移动到hive
  3. -- 带上overwrite会覆盖掉表中原来的数据
  4. -- partition 加载到指定分区

1.2、使用查询语句向表中插入数据

  1. insert overwrite table t1 select * from t2;
  2. --也可以不覆盖掉,直接导入,把关键词overwrite替换为into
  3.  
  4. -- 对于分区表稍微复杂
  5. insert overwrite table t2 partition(day=2) select * from t1;
  6. --有一张大表,可以通过这种方式构建小表。但是这种方式在多个分区的情况下效率很低,会对原始表执行多次扫描。
  7.  
  8. --将一张大表拆开写入分区表的时候应该使用下面的语法
  9. from t1
  10. insert overwrite table t2 partition(day=2) select * where day=2
  11. insert overwrite table t2 partition(day=3) select * where day=3
  12. insert overwrite table t4 select * where day=4

1.3、动态分区的插入

如果分区很多的情况下,单独下插入语句是非常恐怖的事。

所谓的动态分区,指的是插入到目标表时,不指定分区值,仅指定分区字段,分区值是从原始表中取得的。

默认,hive是不支持动态分区插入的,如果不支持的话,可以设置hive.exec.dynamic.partition=true打开。

  1. set hive.exec.dynamic.partition=true;
  2. set hive.exec.dynamic.mode=nonstrict;
  3. set hive.exec.max.dynamic.partitions.pernode=1000;
  1. insert overwrite table t2 partition(province,city) select ...,province,city from a;
  2. --动态分区的字段一定位于其他各个字段的最后

也可以动态静态结合的使用

  1. insert overwrite table t2 partition(province='beijing',city) select ...,province,city from a;
  2. --前面指定了province的值的时候,在select中查不查province已经无所谓了(前面指定的值优先级高,但是不会对后面的查询结果进行过滤,就是说所有的province的值都会改为北京)

1.4、CTAS

使用单个查询语句创建表并加载数据(不能创建分区表,外部表,桶表)

  1. create table ... as select

查询数据的时候允许创建一张表,语法如下

  1. create table t3 as select id from t1 where id =1

1.5、导出数据

有两种方式:

(1)直接使用HDFS命令导出文件夹

(2)使用如下语法的hive

  1. insert overwrite local directory 'localpath' select id from t1;

2、表查询

2.1、数据查询

表可以使用别名

  1. select * from t1 e;

在select 和 where 子句中可以使用hive的内置函数和自定义函数。函数分为普通函数、聚合函数、表函数。其中表函数必须使用别名,不能在where语句中不能引用列别名。

2.2、表连接

hive只支持等值连接,即on子句中使用等号连接。

如果连接语句中有where子句,会先执行join子句,在执行where子句。

2.2.1、内连接

内连接指把符合条件的数据查询出来。

语句如下:

  1. select * from user join job on user.id=job.user_id;
  2. -- 等价于
  3. select * from user , job on user.id=job.user_id;

2.2.2、左外连接

语句如下:

  1. select * from user left outer join job on user.id=job.user_id;

2.2.3、右外连接

和左外连接类似,语句如下

  1. select * from user right outer join job on user.id=job.user_id;

2.2.4、全外连接

语法如下

  1. select * from user outer join job on user.id=job.user_id;

2.2.5、左半连接

老版本特有的功能,用来代替in 和 exist操作

语法如下:

  1. select * from user left semi join job on user.id=job.user_id;
  2. --语句相当于:
  3. select * from user where user.id in (select user_id from job);

但是hive不支持in子句(新版本中已经支持in)

2.2.6、笛卡尔积

语句如下:

  1. select * from user join job;

2.2.7、join 与where的顺序

where 子句的执行顺序是位于join子句之后的。对比下列两个sql语句的输出

  1. select * from user left join job on user.id=job.user_id where job.id=3;
  2. select * from user left join (select * from job where id=3) job on user.id = job.user_id;

第一条语句无任何输出,第二条语句产生三条输出。

2.3、排序

hive支持 order by 和 sort by子句

当可能有多个reduce任务时,order by 是在一个 reduce 任务中进行排序;sort by 是在多个reduce 任务内部进行排序,每个reduce 任务自己排序,不管全局是否有排序。

distribute by 会与 sort by一起使用,目的是在sort 不用排序时 把相同的分类放到一个reduce中进行排序

*cluster by 是distribute by 和 sort by的缩写形式。

2.4、数据倾斜

数据不是均匀分布,在shuffle过程中,map向reduce分配数据的时候,分配的数据量不一样,导致执行时间不一样。

2.5、视图

*作用在于简化复杂查询

创建视图

  1. create view user_view as select * from user where id=1;

3、hive参数

hive-default.xml中的参数

4、hive的文件格式

4.1、自定义hive的文件格式

  1. create table t1(...) stored as textfile;
  2. --缺点:占用空间比较大

sequencefile 是包含键值对的二进制的文件存储格式,支持压缩可以节约存储空间。是hadoop领域的标准文件格式,但是在hadoop之外无法使用。

rcfile 是列式文件存储格式,适合压缩处理。对于有成百上千的字段而言,RCFile 更加适合。

5、调优

5.1、本地模式

对于小文件处理,如果分发到各个节点处理,网络传输等因素效率很低。

对于小数据集,运行时设置SET mapred.job.tracker=local;可以使用本地方式运行,即在hive客户端执行,而不是提交到hadoop集群执行。因此速度更快。

5.2、map side agg

row format, storage format,serde

row foramt 用户指定row foramt(行分隔)

delimited 子句用户处理有分隔符的文件;

escaped by 子句用户普通处理分隔符;

null defined as 子句用户指定空如何显示,默认是'\N';

serde 子句用户指定serde;

stored as textfile 用于指定处处文件必须是普通文件;

stored as sequencefile 用户指定存储文件可以被压缩;

inputformat和outputformat用户指定inputformat和outputformat的名称;

stored as parquet 指定列格式 parquet存储格式;

stored by 用于创建非本地表,如hbase表等;

7、DML

7.1、Alter Table

  1. --表重命名
  2. Alter TABLE table_name RENAME To new_table_name;
  3. --修改表属性
  4. ALTER TABLE table_name SET TBLPROPERTIES table_properties;
  5. --修改注释
  6. ALTER TABLE table_name SET SERDEPROPERTIES serde_paoperties;
  7. --添加SerDe
  8. ALTER TABLE table_name SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];
  9. ALTER TABLE table_name SET SERDEPROPERTIES serde_properties;
  10. --修改表存储
  11. ALTER TABLE table_name CLUSTERED BY(col_name,col_name...) [STORED BY(col_name...)] INTO num_buckets BUCKETS;

7.2、Alter Partition

7.2.1、Add Partitions

  1. ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location1'] partition_spec [LOCATION 'location2'];

7.2.2、Dynamic Partition

7.2.3、Rename Partition

  1. ALTER TABLE table_name Partition partition_spec RENAME TO PARTITION partition_spec;

7.2.4、Recover Partitions

  1. MSCK REPAIR TABLE table_name;
  2. --会把已经位于HDFS的分区目录中,但是在metastore中没有的分区信息,自动添加到metastore中。

7.2.5、Drop Partitions

  1. ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec, PARTITION partition_spec;

如果分区有些保护,可以使用下面语句;

  1. ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec IGNORE PROTECTION;

7.3、Alter Column

7.3.1、Change Column Name/Type/Position/Comment

  1. ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name col_type [COMMENT col_comment] [FIRST|ALTER column_name];

修改语句只会影响metastore,不会影响原始数据。

7.3.2、Add/Replace Columns

7.4、Create/Drop/Alter View

创建视图

  1. CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment],...)] [COMMENT view_comment] [TBLPROPERTIES (property_name=property_value,...)] AS SELECT ...

视图仅是逻辑对象,在HDFS中没有存储。当基表改变时,视图定义不会改变,再次使用视图会报错。

  1. --删除视图
  2. DROP VIEW [IF EXISTS] view_name;
  3. --修改视图定义
  4. ALTER VIEW view_name AS select_statement;

7.5、Create/Drop Functions

7.6、Create/Drop/Grant/Revoke Roles and Privileges

7.7、Show

  1. --显示数据库
  2. SHOW DATABASES;
  3. --显示表
  4. SHOW TABLES [IN database_name];
  5. --显示分区
  6. SHOW PARTITIONS table_name;
  7. --显示一部分分区
  8. SHOW PARTITIONS [db_name].table_name [PARTITION(partition_desc)];
  9. --显示表/分区扩展信息
  10. SHOW TABLE EXTENDED [IN|FROM database_name] LIKE identifier_with_wildcards [PARTITION(partition_desc)];

7.8、Describe

7.9、Select

语法

  1. [WITH CommonTableExpression (,CommonTableExpression)*]
  2.  
  3. SELECT [ALL|DISTINCT] select_expr,select_expr,...
  4.  
  5. FROM table_reference
  6.  
  7. [WHERE where_condition]
  8.  
  9. [GROUP BY col_list]
  10.  
  11. [[CLUSTER BY col_list] | [DISTRIBUTE BY col_list] [SORT BY col_list]]
  12.  
  13. [LIMIT number]

7.9.1、where 子句

where 子句必须是布尔值,可以支持子查询

7.9.2、all and distinct

select 子句中默认是all,可以不写。Distinct 是去重。

7.9.3、基于partition的查询

7.9.4、having 子句

having子句相当于子查询。

7.9.5、limit子句

返回指定数量的数据,数据是任意的。

7.10、使用正则

7.11、group by 子句

7.12、join子句

  1. table_reference JOIN table_factor [join_condition]
  2. | table_reference {LEFT | RIGHT | FULL} [OUTER] JOIN table_reference join_condition
  3. |table_reference LEFT SEMI JOIN table_reference join_condition
  4. |table_reference CROSS JOIN table_reference [join_condition]

不使用join,使用逗号分隔表,也会认为是join操作。

默认,每个join操作会产生一个 M/R job

驱动表

多表联合的时候,非驱动表会被缓存,也可以通过STREAMTABL指定驱动表

10、Types

10.1、符合类型

hive array、map、struct使用

struct:struct 内部的数据可以通过Dot(.)来访问

map(k-v对):访问指定域可以通过["指定域名称"]进行。map["key"]

array:array中的数据为相同类型,通过下标访问内部数据(起始位置0)

10.1.1、struct使用

建表:

  1. create table student_test(id INT,info struct<name:STRING,age:INT>)
  2. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
  3. COLLECTION ITEMS TERMINATED BY ':';
  4. --FIELDS TERMINATED BY :字段之间的分隔符
  5. --COLLECTION ITEMS TERMINATED BY :一个字段各item的分隔符

数据示例:

1,小李:12

加载数据

  1. load data local inpath 'data' into table student_test;

查询:

  1. select info.age from student_test;

10.1.2、array的使用

创建表

  1. create table array_table(name STRING,student_id_list array<INT>)
  2. row format delimited
  3. fields terminated by ','
  4. collection items terminated by ':';

导入数据

  1. load data local inpath 'data6' into table array_table;

查询

  1. select student_id_list[] from array_table;

10.1.3、map使用

创建表

  1. create table map_table(id STRING,pref map<string,int>)
  2. row format delimited
  3. fields terminated by '\t'
  4. collection items terminated by ','
  5. map keys terminated by ':';

导入数据

  1. load data local inpath 'map_data' into table map_table;

查询

  1. select perf['person'] from map_table;

11、ORC

ORC(optimized row columnar) 提供了更高效的方式存储hive数据。使用ORC,会提高读、写、处理数据的能力。

(1)每个task输出会产生一个文件,可以煎炒namenode的压力;

(2)支持datetime、decimal和复合类型;

(3)文件中可以存储轻量级的索引;

(4)支持数据类型的块压缩;

(5)使用多个RecordReader并发的读取相同的文件;

(6)ability to split files without scanning for markers;

(7)bound the amount of memory needed for reading or writing;

(8)metadata stored using Protocol Buffers,which allows addition and removal of fields;

12、CompressedStorage

压缩存储有时候可以获得更好的性能。

使用TextFile 存储时,可以使用GZIP或BZIP2进行压缩。操作如下:

  1. CREATE TABLE raw(line STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
  2. LOAD DATA LOCAL INPATH 'file.gz' INTO TABLE raw;

以上操作的缺点是hive在查下时不能 分割压缩文件,不能并行执行map。

更好的方式如下操作:

  1. CREATE TABLE raw(line STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
  2. CREATE TABLE raw_sequence(line STRING) STORED AS SEQUENCEFILE;
  3. LOAD DATA LOCAL INPATH 'file.gz' INTO TABLE raw;
  4. SET hive.exec.compress.output=true;
  5. SET io.seqfile.compression.type=BLOCK; --NONE/RECORD/BLOCK
  6. INSERT OVERWRITE TABLE raw_sequence SELECT * FROM raw;

把数据插入到另一张表,另一张表使用SequenceFile存储。

13、函数

13.1、常见函数

hive函数分为四大类:单行函数、聚合函数、表函数、分析函数。

在hive客户端输入show functions 中可以看到所有的函数。

查看函数的用法 show function function_name;

表函数:

explode()函数是把一个数组作为数据,输出时数组的每个元素作为单独一行。

示例:

  1. select explode(array(1,23,4)) from dual;
  2. select explode(map(1,11,2,22,4,44)) from dual;

*dual 是一个伪表,满足sql的语法select ... from ...;

*array是一个函数

posexplode()函数和explode()函数非常相似,增加的功能是返回结果带有位置信息,表示第几行。

parse_url_tuple()函数用户解析url信息。

示例:

  1. select parse_url_tuple('http://www.test.com/a.html?key=k1&key2=k2#tag ','HOST','PATH','QUERY','QUERY:k1','QUERY:k2') from dual; 

12.2、自定义函数

12.2.1、自定义单行函数

(1)继承org.apache.hadoop.hive.ql.exec.UDF,覆盖其中的evaluate()方法,该方法的形参数量、类型,返回值类型,都不做限制。返回值只要是hive可以序列化的类型即可。

(2)打包成jar

(3)在hvie命令行下,执行命令ADD JAR ...jar;

(4)在hive命令行下,执行命令CREATE TEMPORARY FUNCTION xxx AS '函数全名称';

如果要删除函数,在hive命令行下,执行DROP TEMPORARY FUNCTION IF EXISTS xxx;

hive学习笔记——表的基本的操作的更多相关文章

  1. hive 学习笔记——表的入门操作和命令

    1.受控表(managed table)包括内部表.分区表.桶表: 1.1.分区表 创建分区表: create table banji(id INT,name STRING) partitioned ...

  2. hive学习笔记-表操作

    Hive数据类型 基本数据类型 tinyint,smallint,int,biging,float,double,decimal,char,varchar,string,binary,boolean, ...

  3. hive学习笔记之三:内部表和外部表

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. hive学习笔记之四:分区表

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. hive学习笔记之五:分桶

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. hive学习笔记之六:HiveQL基础

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. hive学习笔记之七:内置函数

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. hive学习笔记之十:用户自定义聚合函数(UDAF)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<hive学习笔记>的第十 ...

  9. X-Cart 学习笔记(四)常见操作

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...

随机推荐

  1. 【BZOJ 2132】 圈地计划

    Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区 ...

  2. C# Double toString保留小数点方法

    有时候double型数据需要toString(),但又想保留小数,当值为整数,比如3.00时tostring后会变为”3″,具体说明见下: 1 string str0 = i.ToString(&qu ...

  3. java NIO与IO的区别

    nio是new io的简称,从jdk1.4就被引入了.现在的jdk已经到了1.6了,可以说不是什么新东西了.但其中的一些思想值得我来研究.这两天,我研究了下其中的套接字部分,有一些心得,在此分享. 首 ...

  4. 【转】如何设置Android软键盘的默认不弹出?

    在开发Anroid的时候,当你打开一个界面的时候,屏幕的焦点会自动停留在第一个EditText中,Android的软键盘默认会自动弹出,用户第一眼连界面都没有看清楚,软键盘就弹出来了,这就影响到了用户 ...

  5. 学习Linux第二天

    1.Linux目录: 保存系统命令:根目录下的bin和sbin,usr下的bin和sbin /etc:保存配件 /usr:系统软件资源目录 /proc:系统内存分配目录,直接写入内存的 /var:保存 ...

  6. win8 telnet VirtualBox中的redhat9

    1. VirtualBox设置网络连接为“桥接网卡”,并且此网卡要为win8正在使用的网卡(比如我的电脑上使用的就是无线网卡,则选择网卡时也要用无线网卡) 2. 在redhat的终端里,运行ifcon ...

  7. SQL Server表分区【转】

    转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区   什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在 ...

  8. java socket编程基础(转)

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  9. leetcode Largest Rectangle in Histogram 解法二

    上一篇文章讲了该题的一个解法.后来又发现一个更好的解法. 首先依旧考虑一个升序的数列,例如1,2,3,4,5.那么它的最大矩形显然是有5种可能,即 1*5,2*4,3*3,4*2,1*5.所以最大的矩 ...

  10. Appium环境配置

    一.JDK下载.安装及其环境配置 1.下载.安装略过…… 2.环境配置,以jdk-8u45为例,默认安装在 C:\Program Files\Java\jdk1.8.0_45\路径下. 下面设置环境变 ...