1 Hive基本概念

1.1 什么是Hive

Hive:由Facebook开源用于解决海量结构化日志的数据统计。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
本质是:将HQL转化成MapReduce程序,执行流程如下:

  • 1)Hive处理的数据存储在HDFS
  • 2)Hive分析数据底层的实现是MapReduce
  • 3)执行程序运行在Yarn上

1.2 Hive的特点

  1. Hive并不是一个关系型数据库。
  2. Hive不是基于OLTP(在线事务处理)设计的。OLTP设计的软件:侧重点在事务的处理和在线访问。一般RDMS都是基于OLTP设计。
  3. Hive无法做到实时查询,不支持行级别更新(update,delete),因为HDFS不支持随机写。
  4. Hive要分析的数据存储在HDFS,hive为数据创建的表结构(schema),存储在RDMS。
  5. Hive基于OLAP(在线分析处理)设计。OLAP设计的软件:侧重点在数据的分析上,不追求分析的效率。
  6. Hive使用类SQL,称为HQL对数据进行分析
  7. Hive容易使用,可扩展,有弹性

1.2.1 优点

  1. 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
  2. 避免了去写MapReduce,减少开发人员的学习成本。
  3. Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
  4. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
  5. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

1.2.2 缺点

  1. Hive的HQL表达能力有限
    (1)迭代式算法无法表达(人工智能和数据挖掘等都使用大量的迭代式运算)
    (2)数据挖掘方面不擅长
  2. Hive的效率比较低
    (1)Hive自动生成的MapReduce作业,通常情况下不够智能化
    (2)Hive调优比较困难,粒度较粗

1.3 Hive架构原理

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

  1. Client:用户接口,提供CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)。
  2. Metastore:元数据,包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore。
  3. Hadoop:使用HDFS进行存储,使用MapReduce进行计算。
  4. Driver:驱动器
    (1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
    (2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
    (3)优化器(Query Optimizer):对逻辑执行计划进行优化。
    (4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

1.4 Hive和数据库对比

由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。本文将从多个方面来阐述 Hive 和数据库的差异。数据库可以用在 Online 的应用中,但是Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性

1.4.1 查询语言

由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。

1.4.2 数据存储位置

Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。

1.4.3 数据更新

由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET修改数据。

1.4.4 索引

Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。

1.4.5 执行

Hive中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而数据库通常有自己的执行引擎。

1.4.6 执行延迟

Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

1.4.7 可扩展性

由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009年的规模在4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展性非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有100台左右。

1.4.8 数据规模

由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

2 Hive安装

2.1 安装地址

  1. Hive官网地址
  2. 文档查看地址
  3. 下载地址
  4. github地址

2.2 Hive安装部署

1.解压apache-hive-1.2.2-bin.tar.gz

[root@iZnq8v4wpstsagZ software]# tar -zxvf apache-hive-1.2.2-bin.tar.gz -C /opt/module

2.修改/opt/module/apache-hive-1.2.2-bin/conf目录下hive-env.sh.template名称为hive-env.sh

[root@iZnq8v4wpstsagZ conf]# mv hive-env.sh.template hive-env.sh

3.配置hive-env.sh文件

[root@iZnq8v4wpstsagZ conf]# vim hive-env.sh# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/opt/module/hadoop-2.7.7# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/module/apache-hive-1.2.2-bin/conf

4.hadoop集群配置

#在HDFS上创建/tmp和/user/hive/warehouse两个目录并修改他们的同组权限可写
[root@iZnq8v4wpstsagZ hadoop-2.7.7]$ bin/hadoop fs -mkdir /tmp
[root@iZnq8v4wpstsagZ hadoop-2.7.7]$ bin/hadoop fs -mkdir -p /user/hive/warehouse[root@iZnq8v4wpstsagZ hadoop-2.7.7]$ bin/hadoop fs -chmod g+w /tmp
[root@iZnq8v4wpstsagZ hadoop-2.7.7]$ bin/hadoop fs -chmod g+w /user/hive/warehouse

2.3 Hive常见属性配置

2.3.1 Hive数据的存储

  1. Hive要分析的数据是存储在HDFS上。Hive中的数据库的位置在HDFS上是一个目录(default数据库在hdfs上默认目录是/user/hive/warehouse,没有对默认的数据库default创建文件夹);Hive中表的位置在HDFS上也是一个目录,在所在的库目录下创建了一个子目录;Hive中的数据存在表目录下的文件中。
<property><name>hive.metastore.warehouse.dir</name><value>/user/hive/warehouse</value><description>location of default database for the warehouse</description>
</property>
  1. 在Hive中,存储的数据必须是结构化的数据,而且这个数据的格式要和表的属性紧密相关。表在创建时,有分隔符属性,这个分隔符属性,代表在执行MR程序时,使用哪个分隔符去分割每行中的字段;Hive中默认字段的分隔符: ctrl+A,vim中进入编辑模式,ctrl+V 再ctrl+A。
  2. Hive中的元数据(schema)存储在关系型数据库中。默认存储在derby中,derby是使用Java语言编写的一个微型,常用于内嵌在Java中的数据库,derby同一个数据库的实例文件(metastore_db)不支持多个客户端同时访问。

由于Hive默认使用自带的derby数据库存储Metastore,内嵌的derby数据库仅支持单连接,推荐使用MySQL存储Metastore(不使用MySQL可跳过)。

  1. MySQL的安装可参见MySQL笔记
  2. 将mysql驱动程序copy到/opt/module/apache-hive-1.2.2-bin/lib/目录下
  3. 配置metastore存储到MySQL
      [root@iZnq8v4wpstsagZ conf]# touch hive-site.xml[root@iZnq8v4wpstsagZ conf]# vim hive-site.xml
    
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true</value><description>JDBC connect string for a JDBC metastore</description></property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value><description>Driver class name for a JDBC metastore</description></property><!--用户名--><property><name>javax.jdo.option.ConnectionUserName</name><value>root</value><description>username to use against metastore database</description></property><!--密码--><property><name>javax.jdo.option.ConnectionPassword</name><value>000000</value><description>password to use against metastore database</description></property>
    </configuration>
    

    TBLS表存储了Hive的表信息,DBS表存储了Hive的数据库信息,COLUMN_V2表存储了Hive的字段信息;通过DB_ID关联库和表,通过CD_ID关联表和字段。Mysql数据库metastore的编码必须是latin1,且mysql的binlog_format=mixde|row

2.3.2 查询后信息显示配置

在hive-site.xml文件中添加如下配置信息,就可以实现显示当前数据库,以及查询表的头信息配置

<!--查询显示表头信息-->
<property><name>hive.cli.print.header</name><value>true</value>
</property>
<!--显示当前数据-->
<property><name>hive.cli.print.current.db</name><value>true</value>
</property>

2.3.3 Hive运行日志信息配置

Hive的日志配置文件在/opt/module/apache-hive-1.2.2-bin/conf/目录下,修改/opt/module/hive/conf/hive-log4j.properties.template文件名称为hive-log4j.properties。
日志存放目录为:

#/tmp/root
hive.log.dir=${java.io.tmpdir}/${user.name}

可修改该参数更改存放位置。

2.3.4 参数配置方式

查看当前所有的配置信息或某个参数配置

hive (default)> set;
hive (default)> set mapred.reduce.tasks;

1)配置文件:
默认配置文件:hive-default.xml
用户自定义配置文件:hive-site.xml
2)命令行参数方式启动hive(仅对本次hive启动有效):

[root@iZnq8v4wpstsagZ bin]# hive -hiveconf mapred.reduce.tasks=10;

3)参数声明方式(仅对本次hive启动有效):

hive (default)> set mapred.reduce.tasks=10;

2.4 Hive数据访问

2.4.1 Hive客户端访问

#如果是2.x版本需要先初始化derby/mysql数据库
[root@iZnq8v4wpstsagZ bin]# schematool -initSchema -dbType derby
[root@iZnq8v4wpstsagZ bin]# schematool -dbType mysql -initSchema
#启动hive客户端
[root@iZnq8v4wpstsagZ bin]# hive

2.4.2 Hive JDBC访问

#启动hive服务端
[root@iZnq8v4wpstsagZ bin]# hiveserver2 #另开一个窗口使用jdbc访问,连接成功服务端返回OK
[root@iZnq8v4wpstsagZ bin]# beeline
Beeline version 1.2.2 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: root
Enter password for jdbc:hive2://localhost:10000: (回车即可)
Connected to: Apache Hive (version 1.2.2)
Driver: Hive JDBC (version 1.2.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
| test_db        |
| test_db1       |
+----------------+--+
3 rows selected (1.246 seconds)

问题:

beeline> !connect jdbc:hive2://localhost:10000
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: yut
Enter password for jdbc:hive2://localhost:10000:
20/09/08 21:39:21 [main]: WARN jdbc.HiveConnection: Failed to connect to localhost:10000
Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: yut is not allowed to impersonate yut (state=08S01,code=0)

需要配置Hadoop的core-site.xml文件,并重启hadoop

<property><name>hadoop.proxyuser.yut.hosts</name><value>*</value>
</property>
<property><name>hadoop.proxyuser.yut.groups</name><value>*</value>
</property>

参考:https://blog.csdn.net/yunyexiangfeng/article/details/60867563

2.5 Hive基本操作

2.5.1 Hive常用交互命令

用法:

[root@iZnq8v4wpstsagZ bin]# hive --help
Usage ./hive <parameters> --service serviceName <service parameters>
Service List: beeline cleardanglingscratchdir cli hbaseimport hbaseschematool help hiveburninclient hiveserver2 hplsql jar lineage llapdump llap llapstatus metastore metatool orcfiledump rcfilecat schemaTool version
Parameters parsed:--auxpath : Auxiliary jars --config : Hive configuration directory--service : Starts specific service/component. cli is default
Parameters used:HADOOP_HOME or HADOOP_PREFIX : Hadoop install directoryHIVE_OPT : Hive options
For help on a particular service:./hive --service serviceName --help
Debug help:  ./hive --debug --help[root@iZnq8v4wpstsagZ bin]# hive -help
usage: hive-d,--define <key=value>          Variable subsitution to apply to hivecommands. e.g. -d A=B or --define A=B--database <databasename>     Specify the database to use-e <quoted-query-string>         SQL from command line-f <filename>                    SQL from files-H,--help                        Print help information--hiveconf <property=value>   Use value for given property--hivevar <key=value>         Variable subsitution to apply to hivecommands. e.g. --hivevar A=B-i <filename>                    Initialization SQL file-S,--silent                      Silent mode in interactive shell-v,--verbose                     Verbose mode (echo executed SQL to theconsole)

示例:

# 定义一个变量,在hive启动后,可以使用${变量名}引用变量,-d和--hivevar作用一样
#[root@iZnq8v4wpstsagZ bin]# hive --hivevar t=person
[root@iZnq8v4wpstsagZ bin]# hive -d t=person
hive> select * from ${t};# 指定hive启动后使用哪个库
[root@iZnq8v4wpstsagZ bin]# hive --database mydb
hive(mydb)>#指定命令行获取的一条引号括起来的sql,执行完返回结果后退出cli
[root@iZnq8v4wpstsagZ bin]# hive -e 'select * from person'# 执行一个sql文件,执行完返回结果后退出cli
[root@iZnq8v4wpstsagZ bin]# hive -f test.sql# 在hive启动前定义一对属性。hive在运行时,先读取hadoop的全部8个配置文件,再读取hive-default.xml和hive-site.xml,指定--hiveconf可以覆盖之前的属性值
[root@iZnq8v4wpstsagZ bin]# hive --hiveconf hive.cli.print.current.db=true# 与-f类似,区别在于不会退出cli
[root@iZnq8v4wpstsagZ bin]# hive -i test.sql# 静默模式,不打印与结果无关的信息,如:OK
[root@iZnq8v4wpstsagZ bin]# hive --silent

2.5.2 Hive其他命令操作

1.退出cli

hive> exit;
#或
hive> quit;

在新版的hive中没区别了,在以前的版本是有的:
exit:先隐性提交数据,再退出;
quit:不提交数据,退出;

2.在hive cli命令窗口中执行hdfs命令,可使用dfs:

hive> dfs -ls /;

3.在hive cli命令窗口中执行Liunx命令,可使用!command

hive> !ls /opt/module/datas;

4.查看在hive中输入的所有历史命令

#进入当前用户的家目录
[root@iZnq8v4wpstsagZ bin]# cat /root/.hivehistory

3 Hive数据类型

3.1 基本数据类型

3.1.1 数值类型

Hive数据类型 Java数据类型 说明
TINYINT byte 1byte有符号整数,-128 to 127
SMALINT short 2byte有符号整数,-32,768 to 32,767
INT/INTEGER int 4byte有符号整数,-2,147,483,648 to 2,147,483,647
BIGINT long 8byte有符号整数,-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
FLOAT float 4byte单精度浮点数
DOUBLE double 8byte双精度浮点数
DECIMAL/DECIMAL(precision, scale) Decimal Hive 0.11.0开始引入,精度为38位,Hive 0.13.0引入了用户自定义的精度和比例
NUMERIC Decimal 类似DECIMAL,开始于Hive 3.0.0

3.1.2 日期时间类型

Hive数据类型 Java数据类型 说明
TIMESTAMP TimeStamp 时间戳yyyy-mm-dd hh:mm:ss[.f…],开始于Hive 0.8.0
DATE java.util.Date 日期yyyy-mm-dd,开始于Hive 0.12.0
INTERVAL - 开始于Hive 1.2.0

3.1.3 字符串类型

Hive数据类型 Java数据类型 说明
STRING string 字符系列,可以指定字符集,可以使用单引号或者双引号,理论上可存储2GB
VARCHAR string 长度不定字符串,长度1 - 65535,开始于Hive 0.12.0
CHAR string 长度固定字符串,长度0-255,开始于Hive 0.13.0

3.1.3 其他类型

Hive数据类型 Java数据类型 说明
BOOLEAN boolean 布尔类型,true或者false
BINARY - 字节序列,由于HDFS存储的都是文本类型,基本不会用到

3.2 集合数据类型

Hive数据类型 Java数据类型 说明
STRUCT 类似与Java中只含属性的对象 STRUCT<col_name : data_type[COMMENT col_comment], …>
MAP 类似Map MAP<primitive_type, data_type>,从Hive 0.14开始允许使用负值和非常量表达式
ARRAY 类似Array ARRAY<data_type>,从Hive 0.14开始允许使用负值和非常量表达式
UNIONTYPE - UNIONTYPE<data_type, data_type, …>,开始于Hive 0.7.0,类似与数组,可以存储不同类型数据的集合

Map和Struct之间的区别在于元素的key/属性是否可以变化,Map的key是可以变化的,但Struct的属性名是不变的。

示例:

{"name": "songsong","friends": ["bingbing" , "lili"] , //列表Array, "children": {                      //键值Map,"xiao song": 18 ,"xiaoxiao song": 19}"address": {                       //结构Struct,"street": "hui long guan" ,"city": "beijing" }
}

1.创建本地文件collection.txt

[root@iZnq8v4wpstsagZ datas]# vim collection.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing

2.创建表

[root@iZnq8v4wpstsagZ datas]# hive
hive (default)> create table collection(> name varchar(8),> friends array<string>,> children map<string,int>,> address struct<street:string,city:string>> )> row format delimited fields terminated by ','     #列分割符> collection items terminated by '_'                  #集合数据类型分隔符> map keys terminated by ':'                         #Map中的kv分隔符> lines terminated by '\n';                         #行分隔符(默认)

注意:在一个表中,array每个元素之间的分隔符和Map每个Entry之间的分隔符和struct每个属性之间的分隔符需要一致

3.导入collection.txt中数据到数据表collection

hive (default)> load data local inpath '/opt/module/datas/collection.txt' into table collection;

4.查询

hive (default)> select * from collection where name='songsong';
songsong    ["bingbing","lili"] {"xiao song":18,"xiaoxiao song":19} {"street":"hui long guan","city":"beijing"}
hive (default)> select name,friends[1],children['xiao song'],address.city from collection where name='songsong';
songsong    lili    18  beijing

3.3 类型转换

Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换。

3.3.1 隐式类型转换

  • 任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
  • 所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
  • TINYINT、SMALLINT、INT都可以转换为FLOAT。
  • BOOLEAN类型不可以转换为任何其它的类型。

3.3.2 强制类型转换

使用CAST可以实现强制类型转换,如:

CAST('1' AS INT)

如果强制类型转换失败则会返回NULL。

4 Data Definition Language

  • CREATE DATABASE/SCHEMA,TABLE,VIEW,FUNCTION,INDEX
  • DROP DATABASE/SCHEMA,TABLE,VIEW,INDEX
  • TRUNCATE TABLE
  • ALTER DATABASE/SCHEMA,TABLE,VIEW
  • MSCK REPAIR TABLE(or ALTER TABLE RECOVER PARTITIONS)
  • SHOW DATABASES/SCHEMAS,TABLES,TBLPROPERTIES,VIEWS,PARTITIONS,FUNCTION,INDEX[ES], COLUMNS, CREATE TABLE
  • DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name

partitions除了show partitions table_name,通常都用于table语句的选项。

4.1 Create/Drop/Alter/Use Database

4.1.1 Create Database

语法:

-- 创建数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name[COMMENT database_comment][LOCATION hdfs_path]        -- 库在hdfs上路径[MANAGEDLOCATION hdfs_path] -- hive4.0可用[WITH DBPROPERTIES (property_name=property_value, ...)];

示例:

#创建一个数据库
hive (default)> create database db_hive
#避免要创建的数据库已经存在错误,增加if not exists判断
hive (default)> create database if not exists db_hive;
#创建一个数据,指定数据库在HDFS上的存放位置,默认在/user/hive/warehouse/目录下创建db_hive_loc.db
hive (default)> create database if not exists db_hive_loc location '/user/hive/warehouse/db_hive_loc.db' WITH DBPROPERTIES('ownner'='yut','createTime'='2020-01-01');

4.1.2 Drop Database

语法:

-- 删除数据库,默认是RESTRICT,如果数据库不为空不可删除;可使用CASCADE级联删除
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
#删除空数据库
hive (default)> drop database if exists db_hive1;
#数据库不为空可使用cascade级联删除(慎用)
drop database if exists db_hive cascade;

4.1.3 Alter Database

用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置kv属性,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
语法:

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);   -- (Note: SCHEMA added in Hive 0.14.0)ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;   -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path; -- (Note: Hive 2.2.1, 2.4.0 and later)ALTER (DATABASE|SCHEMA) database_name SET MANAGEDLOCATION hdfs_path; -- (Note: Hive 4.0.0 and later)

示例:

#添加数据库属性,不会移除(可覆盖)之前的属性,可通过desc database extended db_hive查看
hive (default)> alter database db_hive set dbproperties('createTime'='20170830','updateTime'='20191012');
#更改数据库的默认目录,新创建的表将在新目录下,不会将之前目录下的数据移动到新目录
hive (default)> alter database db_hive set location 'hdfs://aliyun220:9000/db_hive';

4.1.4 查询数据库

语法:

-- 查看数据库
DESCRIBE DATABASE [EXTENDED] db_name;
DESCRIBE SCHEMA [EXTENDED] db_name;          -- (Note: Hive 1.1.0 and later)

示例:

#显示所有数据库
hive (default)> show databases;
#过滤显示数据库
hive (default)> show databases like 'db_hive*';
#显示数据库信息
hive (db_hive)> desc database db_hive;
#显示数据库详细信息,extended
hive (default)> desc database extended db_hive;

4.2 Create/Drop/Truncate Table

4.2.1 Create Table

-- 第一种
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])][COMMENT table_comment][PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)][CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS][SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)[STORED AS DIRECTORIES][[ROW FORMAT row_format] [STORED AS file_format]| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)[AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)-- 第二种
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_nameLIKE existing_table_or_view_name[LOCATION hdfs_path];

关键字分析:

data_type: primitive_type| array_type| map_type| struct_type| union_type  -- (Note: Available in Hive 0.7.0 and later)primitive_type: TINYINT| SMALLINT| INT| BIGINT| BOOLEAN| FLOAT| DOUBLE| DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)| STRING| BINARY      -- (Note: Available in Hive 0.8.0 and later)| TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)| DECIMAL     -- (Note: Available in Hive 0.11.0 and later)| DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)| DATE        -- (Note: Available in Hive 0.12.0 and later)| VARCHAR     -- (Note: Available in Hive 0.12.0 and later)| CHAR        -- (Note: Available in Hive 0.13.0 and later)array_type : ARRAY < data_type >map_type: MAP < primitive_type, data_type >struct_type: STRUCT < col_name : data_type [COMMENT col_comment], ...>union_type: UNIONTYPE < data_type, data_type, ... >  -- (Note: Available in Hive 0.7.0 and later)row_format: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char][NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]file_format:SEQUENCEFILE| TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)| RCFILE      -- (Note: Available in Hive 0.6.0 and later)| ORC         -- (Note: Available in Hive 0.11.0 and later)| PARQUET     -- (Note: Available in Hive 0.13.0 and later)| AVRO        -- (Note: Available in Hive 0.14.0 and later)| JSONFILE    -- (Note: Available in Hive 4.0.0 and later)| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classnamecolumn_constraint_specification:[ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK  [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]default_value:[ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ] constraint_specification:[, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ][, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE [, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ][, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
  1. CREATE TABLE创建表,使用IF NOT EXISTS判断表是否存在,避免异常。
  2. EXTERNAL创建外部表。
  3. COMMENT为表和列添加注释。
  4. PARTITIONED BY创建分区表
  5. CLUSTERED BY创建分桶表
  6. SORTED BY排序
  7. ROW FORMAT DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] [NULL DEFINED AS char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]。SerDe是Serialize/Deserilize的简称,目的用于序列化和反序列化。用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
  8. STORED AS指定存储文件类型,常用的有SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
  9. LOCATION指定表在HDFS上的存储位置
  10. LIKE复制现有的表结构,不复制数据

4.2.1.1 管理表

默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。

#普通创建表
hive (default)> create table if not exists student2(> id int, > name string> )> row format delimited fields terminated by '\t'> stored as textfile> location '/user/hive/warehouse/student2';
#根据查询结果创建表,不能创建分区表,分区字段会被当成普通字段
hive (default)> create table if not exists student3 as select id, name from student;
#复制完全一样的表结构
hive (default)> create table if not exists student4 like student;
#查询表的类型,管理表或外部表
hive (default)> desc formatted student2;

4.2.1.2 外部表

因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

#普通创建表
hive (default)> create external table if not exists student3(> id int, > name string> )> row format delimited fields terminated by '\t'> stored as textfile> location '/user/hive/warehouse/student3';

4.2.1.3 管理表与外部表的互相转换

#将外部表转换为管理表,TRUE/FALSE必须大写
hive (default)> alter table student3 set tblproperties('EXTERNAL'='FALSE');
#查看表详情
hive (default)> desc formatted student3;

4.2.1.4 分区表

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是在表目录下分多个子目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

#创建分区表,根据月份分区
hive (default)> create table dept_partition(> deptno int,> dname string,> loc string> )> partitioned by(month string)> row format delimited fields terminated by '\t';
#加载数据到分区表,向分区导入数据必须指定分区
hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table dept_partition partition(month='201910');
#查询分区表数据
hive (default)> select * from dept_partition where month='201910';#查看分区表分区
hive (default)> show partitions dept_partition;#创建单个分区
hive (default)> alter table dept_partition add partition(month='201909');
#创建多个分区
hive (default)> alter table dept_partition add partition(month='201907') partition(month='201908');#删除单个分区
hive (default)> alter table dept_partition drop partition (month='201907');
#删除多个分区,注意逗号分割
hive (default)> alter table dept_partition drop partition (month='201908'), partition (month='201909');

多级分区则会创建多级目录。

几种加载数据的方式:
普通表加载数据可以直接通过dfs命令上传数据文件到表目录下,分区表与之不同,需要关联。

1.正常加载数据到分区表:

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table dept_partition partition(month='201910');

2.把数据直接上传到HDFS目录上,让分区、数据与分区表产生关联

#创建分区目录
hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition/month=201912
#上传数据文件
hive (default)> dfs -put /opt/module/datas/dept.txt  /user/hive/warehouse/dept_partition/month=201912;#执行修复命令或添加分区,即可查询到分区和数据
hive (default)> msck repair table dept_partition;
#or
hive (default)> alter table dept_partition add partition(month='201912');

3.创建文件夹后load数据到分区

#创建分区目录
hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition/month=201901
#加载数据到分区目录
hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table dept_partition partition(month='201901');

4.2.1.5 分桶表

详见6.1.5 分桶及抽样查询

4.2.2 Drop/Truncate Table

语法:

-- 删除表的元数据和数据,如果配置了Trash(并且未指定PURGE),则数据实际上会移动到.Trash/Current目录,元数据完全丢失。
-- 删除EXTERNAL表数据不会被删除,但是从Hive4.0.0开始,通过配置external.table.purge=true,数据将会被删除。也可以通过设置表的属性auto.purge=true来阻止Trash。
DROP TABLE [IF EXISTS] table_name [PURGE];     -- (Note: PURGE available in Hive 0.14.0 and later,该变量表示删除的数据不会进入回收站)-- 移除一个表/分区的所有行,如果开启了Trash,将被移入.Trash/Current,否则将被永久删除;
-- 从Hive2.3.0开始,如果表的属性auto.purge=true(默认false),删除的数据将不会被Trash,该属性仅适用于managed Table.
TRUNCATE [TABLE] table_name [PARTITION partition_spec];partition_spec:: (partition_column = partition_col_value, partition_column = partition_col_value, ...)
#删除表
hive (default)> drop table dept_normal;#清除表的数据
hive (default)> truncate table dept_normal;

4.2.3 修改表

4.2.3.1 重命名表

hive (default)> alter table dept rename to dept_normal;

4.2.3.2 增加/修改/删除表分区

详见4.2.1.4 分区表

4.2.3.3 增加/修改/替换列信息

语法:

-- 更新列语法
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
-- 增加和替换列语法
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)

示例:

#添加列
hive (default)> alter table dept_normal add columns(location string);
#更新列
hive (default)> alter table dept_normal change column loc loc string;
#调整列的顺序,将location列放到deptno列后
hive (default)> alter table dept_normal change column location location string after deptno;
#替换表中所有字段,相当于重新定义整个表字段
hive (default)> alter table dept_normal replace columns(deptno int,dname string,loc string);

5 Data Manipulation Language

5.1 数据导入

5.1.1 Load

作用是将数据直接加载到表目录。

语法:

LOAD DATA [LOCAL] INPATH path_name [OVERWRITE] INTO TABLE table_name [PARTITION (partcol1=val1,…)] [INPUTFORMAT 'inputformat' SERDE 'serde'];
  • LOCAL:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表,且HDFS使用的是mv命令
  • OVERWRITE:表示覆盖表中已有数据,否则表示追加
  • PARTITION :表示上传到指定分区(分区表)
  • INPUTFORMAT :从Hive 3.0开始

5.1.2 Insert

通过运行MapReduce程序将数据输出到表目录。向分桶表中插入数据或指定的表中的数据不以纯文本的方式存储,则必须使用Insert插入数据。

语法:

-- =================================>Inserting values into tables from SQL
INSERT INTO|OVERWRITE TABLE table_name [PARTITION (partcol1=val1,…)] VALUES (val1,val2,...),...-- =================================>Inserting data into Hive Tables from queries
-- Standard syntax:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;-- Hive extension (multiple inserts):
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;FROM from_statement
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2]
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] ...;

示例:

#插入多条数据
hive (default)> insert into table dept_partition partition(month='201910') values(1,'c','luan'),(2,'py','hefei');#插入查询结果
hive (default)> insert into table dept_partition partition(month='201907') select deptno,dname,loc from dept_partition where month='201911';

5.1.3 As Select

#根据查询结果创建表
hive (default)> create table if not exists student3 as select id, name from student;

5.1.4 Location

在建表时,指定表的location为数据存放的目录,不适用于分桶表。

#指定表加载数据路径
hive (default)> create table if not exists student5(> id int, name string> )> row format delimited fields terminated by '\t'> location '/user/hive/warehouse/student5';
#上传数据
hive (default)> dfs -put /opt/module/datas/student.txt /user/hive/warehouse/student5;

5.1.5 Import

不仅可以导入数据还可以顺便导入元数据(表结构)。Import只能导入export输出的内容!
语法:

IMPORT [[EXTERNAL] TABLE new_or_original_tablename [PARTITION (part_column="value"[, ...])]]
FROM 'source_path'
[LOCATION 'import_target_path']
①如果向一个新表中导入数据,hive会根据要导入表的元数据自动创建表和分区。
②如果向一个已经存在的表导入数据,在导入之前会先检查表的结构和属性是否一致,只有在表的结构和属性一致时,才会执行导入。
③不管表是否存在,要导入的分区必须是不存在的。
④如果导入的是EXTERNAL表,导入的数据仅和该表做元数据的关联,不会移动数据到表目录下,可以通过LOCATION去指定移动。

示例:

hive (default)> import table dept_partition partition(month='201909') from'/user/hive/warehouse/export/dept';

5.2 数据导出

5.2.1 Insert

将查询的结果导出到本地或HDFS指定目录。
语法:

-- Standard syntax:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [STORED AS file_format] -- Note: Only available starting with Hive 0.11.0
SELECT ... FROM ...-- Hive extension (multiple inserts):
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...

示例:

#结果导出到本地目录(数据未格式化)
hive (default)> insert overwrite local directory '/opt/module/datas/export/dept' select * from dept_partition;
#格式化导出到本地目录
hive (default)> insert overwrite local directory '/opt/module/datas/export/dept' row format delimited fields terminated by '\t' select * from dept_partition;
#格式化导出到HDFS上
hive (default)> insert overwrite directory '/user/yutao/dept' row format delimited fields terminated by '\t' select * from dept_partition;

5.2.2 Hadoop

hive (default)> dfs -get /user/hive/warehouse/dept_partition/month=201909/000000_0
/opt/module/datas/export/dept_hadoop.txt;

5.2.3 Hive Shell

[root@iZnq8v4wpstsagZ bin]# hive -Se 'select * from dept_partition;' > /opt/module/datas/export/dept_hive.txt;

5.2.4 Export

既能导出数据,还可以导出元数据(表结构)。export会在hdfs的导出目录中,生成数据和元数据;导出的元数据是和RDMS无关;如果是分区表,可以选择将分区表的部分分区进行导出。
语法:

EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])]
TO 'export_target_path' [ FOR replication('eventid') ]
#导出到HDFS上
hive (default)> export table dept_partition to '/user/hive/warehouse/export/dept';

5.2.5 Sqoop

//TODO

5.3 数据清除

Truncate命令详情见4.2.2 Drop/Truncate Table

6 Data Retrieval: Query

查询语法:

[WITH CommonTableExpression (, CommonTableExpression)*]    --(Note: Only available starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, select_expr, ...       FROM table_reference            --(As of Hive 0.13.0, FROM is optional (for example, SELECT 1+1).)[WHERE where_condition][GROUP BY col_list][ORDER BY col_list [ASC|DESC]][CLUSTER BY col_list| [DISTRIBUTE BY col_list] [SORT BY col_list [ASC|DESC]]][LIMIT [offset,] rows]          --(offset从Hive 2.0.0开始支持)
  • SELECT语句可以是联合查询或另一个查询的子查询的一部分
  • table_reference可以是常规表,视图,联接构造或子查询
  • 表名和列名不区分大小写
    - 在Hive 0.12和更早版本中,表和列名称中仅允许使用字母数字和下划线字符。在Hive 0.13和更高版本中,列名称可以包含任何 Unicode 字符。反引号(`)中指定的任何列名均按字面意义处理。在反引号字符串中,使用双反引号(``)表示反引号字符。
    - 要恢复到0.13.0之前的行为并将列名限制为字母数字和下划线字符,请将配置属性设置 hive.support.quoted.identifiers=none,带反引号的名称被解释为正则表达式。

6.1 普通查询

sql执行顺序:

  1. FROM字句:执行顺序为从后往前、从右到左。数据量较大的表尽量放在后面。
  2. WHERE字句:执行顺序为自下而上、从右到左。将能过滤掉最大数量记录的条件写在WHERE字句的最右。
  3. GROUP BY:执行顺序从右往左分组,最好在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉
  4. HAVING字句:消耗资源。尽量避免使用,HAVING会在检索出所有记录之后才对结果进行过滤,需要排序等操作。
  5. SELECT字句:少用*号,尽量使用字段名称,oracle在解析的过程中,通过查询数据字典将*号依次转换成所有列名,消耗时间。
  6. ORDER BY字句:执行顺序从左到右,消耗资源

6.1.1 基本查询

支持的算术运算符有:
+(加) -(减) *(乘) /(除) %(取余) &(按位取与) |(按位取或) ^ (按位异或)~(按位取反)

#查询所有列
hive (default)> select * from dept;
#查询当前数据库(从Hive 0.13.0开始)
hive (default)> SELECT current_database();
#指定数据库查询(从Hive 0.7开始的)
hive (default)> select * from db_hive.emp;
#查询具体的列,可取别名,as可省略
hive (default)> select deptno as no,dname from dept_normal
#运算符
hive (default)> select sal+1 from emp;#统计数量
hive (default)> select count(*) cnt from emp;
#取最大值
hive (default)> select max(sal) max_sal from emp;
#取最小值
hive (default)> select min(sal) min_sal from emp;
#取和
hive (default)> select sum(sal) sum_sal from emp;
#取平均值
hive (default)> select avg(sal) avg_sal from emp;#偏移量默认为0,查询5行
hive (default)> select * from emp limit 5;
#偏移量为2,查询2行,从Hive 2.0.0开始支持偏移量
hive (default)> select * from emp limit 2,2;

6.1.2 WHERE条件查询

#where条件查询,用法与mysql相同
hive (default)> select * from emp where sal >1000;

比较运算符:

操作符 支持的数据类型 描述
A=B 基本数据类型 如果A等于B则返回TRUE,反之返回FALSE
A<=>B 基本数据类型 如果A和B都为NULL,则返回TRUE,其他的和等号(=)操作符的结果一致,如果任一为NULL则结果为NULL
A<>B,A!=B 基本数据类型 A或者B为NULL则返回NULL;如果A不等于B,则返回TRUE,反之返回FALSE
A<B 基本数据类型 A或者B为NULL,则返回NULL;如果A小于B,则返回TRUE,反之返回FALSE
A<=B 基本数据类型 A或者B为NULL,则返回NULL;如果A小于等于B,则返回TRUE,反之返回FALSE
A>B 基本数据类型 A或者B为NULL,则返回NULL;如果A大于B,则返回TRUE,反之返回FALSE
A>=B 基本数据类型 A或者B为NULL,则返回NULL;如果A大于等于B,则返回TRUE,反之返回FALSE
A [NOT] BETWEEN B AND C 基本数据类型 如果A,B或者C任一为NULL,则结果为NULL。如果A的值大于等于B而且小于或等于C,则结果为TRUE,反之为FALSE。如果使用NOT关键字则可达到相反的效果。
A IS NULL 所有数据类型 如果A等于NULL,则返回TRUE,反之返回FALSE
A IS NOT NULL 所有数据类型 如果A不等于NULL,则返回TRUE,反之返回FALSE
IN(val1,val2,…) 所有数据类型 使用 IN运算显示列表中的值
A [NOT] LIKE B STRING 类型 B是一个SQL下的简单正则表达式,如果A与其匹配的话,则返回TRUE;反之返回FALSE。B的表达式说明如下:‘x%’表示A必须以字母‘x’开头,‘%x’表示A必须以字母’x’结尾,而‘%x%’表示A包含有字母’x’,可以位于开头,结尾或者字符串中间。如果使用NOT关键字则可达到相反的效果。
A RLIKE B,A REGEXP B STRING 类型 B是一个正则表达式,如果A与其匹配,则返回TRUE;反之返回FALSE。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。

逻辑运算符:

操作符 含义
AND 逻辑并
OR 逻辑或
NOT 逻辑否

6.1.3 Group By分组 与 Having分组筛选

运行mr

#分组查询+having筛选,用法与mysql相同
hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

6.1.4 Order By/Sort By排序

Order By:全局排序,会运行一个ReduceTask。

#全局排序+二次排序(与mysql中用法相同)
hive (default)> select ename, sal*2 twosal from emp order by twosal,ename;

Sort By:每个Reducer内部进行排序,对全局结果集来说不是排序。

#局部排序。设置4个ReduceTask,导出4个内部有序的数据文件,如果只写sort by,由于没有指定MapTask的分区规则会随机分区。
hive (default)> set mapreduce.jo.reduces=4;
hive (default)> insert overwrite local directory '/home/yut/sortby' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'> select * from emp sort by sal desc ;

Distribute By:指定分区规则,MapTask根据规则分区,一般与sort by一起使用。

#局部排序。通过deptno分区,再通过sal倒叙排序
hive (default)> set mapreduce.jo.reduces=4;
hive (default)> insert overwrite local directory '/home/yut/sortby' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'> select * from emp DISTRIBUTE BY deptno sort by sal desc ;

Cluster By:当distribute by和sorts by字段相同时,可以使用cluster by方式。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

hive (default)> select * from emp cluster by deptno;
#等价于
hive (default)> select * from emp distribute by deptno sort by deptno;

6.1.5 分桶及抽样查询

分区与分桶:

  • 分区针对的是数据的存储路径;分桶针对的是数据文件,通过运行MapReduce的分区实现。
  • 分区提供了一种隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区,特别是要确定合适的划分大小。
  • 分桶是将数据集分解成更容易管理的若干部分的另一种技术。

6.1.5.1 分桶表

#根据id创建4个分桶
hive (default)> create table stu_buck(> id int,> name string> )> clustered by(id)    #实际上指定的MapTask分区的字段> SORTED BY (id DESC)     #id降序排序> into 4 buckets      #实际上指定的ReduceTask数量> row format delimited fields terminated by '\t';
#强制分桶,属性必须设置为true
hive (default)> set hive.enforce.bucketing=true;
#强制排序,属性必须设置为true
hive (default)> set hive.enforce.sorting=true;#添加的数据无法分桶
hive (default)> load data local inpath '/opt/module/datas/students.txt' into table stu_buck;
#运行的是MR,可以分桶
hive (default)> insert into table stu_buck select id,name from stu;

注意:向分桶表导入数据必须允许MapReduce程序,才能实现分桶操作;load的方式,只是执行put操作,无法满足分桶表导入数据。

6.1.5.2 抽样查询

语法:TABLESAMPLE(BUCKET x OUT OF y [ON col_name])

#假设总bucket=4,从第一个bucket(x)开始抽样,每间隔2(y)个bucket抽取一个bucket,总共抽取2(总bucket/y)个bucket,即第一个bucket和第三个bucket
hive (default)> select * from stu_buck tablesample(bucket 1 out of 2 on id);
  • x表示从哪个bucket开始抽取,如果需要取多个bucket,以后的bucket为当前bucket加上y
  • y必须是table总bucket数的倍数或者因子
  • 0<x<=y

6.2 连接查询

连接查询中的笛卡儿积会在以下几种情况下产生:

  • 省略连接条件
  • 连接条件无效
  • 所有表中的所有行互相连接

连接查询中join…on不支持or

语法:

join_table:table_reference [INNER] JOIN table_factor [join_condition]| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition| table_reference LEFT SEMI JOIN table_reference join_condition| table_reference CROSS JOIN table_reference [join_condition]     --(as of Hive 0.10,笛卡儿积被禁用,可以通过设置hive.strict.checks.cartesian.product=false且hive.mapred.mode未设置为'strict')table_reference:table_factor| join_tabletable_factor:tbl_name [alias]| table_subquery alias| ( table_references )join_condition:ON expression

6.2.1 等值连接

Hive支持通常的SQL JOIN语句,但是只支持等值连接,非等值连接被禁用,需要设置相关配置以开启(设置hive.strict.checks.cartesian.product=false且hive.mapred.mode未设置为’strict’)。

hive (default)> select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;

6.2.2 内连接

内连接是相对于外连接的,只有满足关联条件才输出,而关联条件未必是等值关联,从集合论角度看:等值连接是内连接的子集。

hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

6.2.3 左外连接

JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。

hive (default)> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;

6.2.4 右外连接

JOIN操作符右边表中符合WHERE子句的所有记录将会被返回

hive (default)> select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;

6.2.5 满外连接

将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。

hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;

7 函数

详见:大数据之Hive函数及案例

8 解压缩及优化

详见:大数据之Hive优化

大数据之Hive入门相关推荐

  1. 大数据架构师入门学习

    经常有初学者在博客和QQ问我,自己想往大数据方向发展,该学哪些技术,学习路线是什么样的,觉得大数据很火,就业很好,薪资很高.如果自己很迷茫,为了这些原因想往大数据方向发展,也可以,那么我就想问一下,你 ...

  2. 大数据软件学习入门技巧

    大数据软件学习入门技巧,一般而言,在进行大数据处理时,会先使用大数据数据库,如 MongoDB. GBase等.然后利用数据仓库工具,对数据进行清理.转换.处理,得出有价值的数据.接着用数据建模工具建 ...

  3. kafka分区与分组原理_大数据技术-Kafka入门

    在大数据学习当中,主要的学习重点就是大数据技术框架,针对于大数据处理的不同环节,需要不同的技术框架来解决问题.以Kafka来说,主要就是针对于实时消息处理,在大数据平台当中的应用也很广泛.大数据学习一 ...

  4. 大数据第三季--Hive(day3)-徐培成-专题视频课程

    大数据第三季--Hive(day3)-1425人已学习 课程介绍         大数据第三季--Hive(day3) 课程收益     大数据第三季--Hive(day3) 讲师介绍     徐培成 ...

  5. 大数据学习路线-入门精简

    大数据学习路线入门精简 大数据的学习路程还是比较漫长的,最重要一点!!耐下心来踏踏实实去学,既然选择了就不要放弃,加油吧.

  6. 新手学习大数据技术如何入门?

    新手学习大数据技术如何入门? [导语]对于已经就业的从业者来说,学习路线和方式与在读学生还是有较大区别的,在读的学生可以按照编程语言.操作系统.机器学习.大数据平台等内容陆续学习,那么新手学习大数据技 ...

  7. 大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之3.数据仓库工具Hive基础

    文章目录 1.Hive概述 (1)数仓工具Hive的产生背景 (2)数仓工具Hive与RDBMS对比 (3)数仓工具Hive的优缺点 (4)数仓工具Hive的架构原理 2.Hive安装与配置 (1)安 ...

  8. 大数据学习——Flume入门

    文章目录 一.Flume概述 1.1.Flume定义 1.2.Flume基础架构 二.Flume快速入门 2.1.安装Flume部署 2.2.入门案例 2.2.1.监控端口数据(官方案例) 2.2.2 ...

  9. 大数据架构师从入门到精通 学习必看宝典

    经常有初学者在博客和QQ问我,自己想往大数据方向发展,该学哪些技术,学习路线是什么样的,觉得大数据很火,就业很好,薪资很高.如果自己很迷茫,为了这些原因想往大数据方向发展,也可以,那么我就想问一下,你 ...

最新文章

  1. mysql中拼接用什么_MySQL中常用的拼接语句的小结(代码示例)
  2. 规则化和模型选择(Regularization and model selection)
  3. 推荐一位学霸的秋招经历(已收到百度、阿里、腾讯、美团、京东、拼多多的 offer)...
  4. java 泛型--桥方法
  5. hive入门之安装模式
  6. 获取不到时间_一月自考成绩查询时间一出,看了文章这次稳过
  7. 又一所新大学来了!投资百亿,对标国际一流大学
  8. linux操作系统中的shell编程----基于头歌实践教学编写shell脚本测试结果
  9. Bootstrap 工具提示插件Tooltip 的选项
  10. Attention注意力机制总结
  11. js正侧表达式 三目运算的保留4位小数的运算
  12. 1.PHP数据库陷阱
  13. 如何在dev cpp中使用c++11标准
  14. C++ 定时每天十二点做某事
  15. INFOR SCE开发说明
  16. java中两种异常类型_Java中的三种异常类型
  17. 摄影中的曝光补偿、白加黑减_我是亲民_新浪博客
  18. 【前端+后端】前后端分离之——前后端axios通信
  19. Springboot+axios+vue使用VerifyCodeUtils工具类实现验证码图片功能
  20. 不能打开要写入的文件,软件安装不上解决方法

热门文章

  1. 【牛客内部题:富婆价值最大化!】模拟贪心C++
  2. Python数据处理之一:数据读取
  3. 震惊!我竟然在1080Ti上加载了一个35亿参数的模型(ZeRO, Zero Redundancy Optimizer)
  4. 定位自主高端,2019款奔驰C级诠释优雅与豪华的气息
  5. 微信转发的文件服务器留存吗,微信转发这种视频会感染病毒泄露隐私?网警的查证结果来了...
  6. 2020蓝天杯论文评比系统_获奖通报 | 铜山区在江苏省第十四届(2020年)“蓝天杯”中小学优秀教学设计评选中荣获佳绩...
  7. 全基因组测序 从头测序(de novo sequencing) 重测序(re-sequencing)
  8. F007-正本清源说奥派 #F1170
  9. poe交换机供电方法
  10. Linux下网络相关结构体 struct servent