hive01

hive

hive介绍

hadoop生态系统就是为处理大数据集而产生的一个合乎成本效益的解决方案。hadoop的MapReduce可以将计算任务分割成多个处理单元然后分散到家用的或服务器级别的硬件上,降低成本并提供水平伸缩性。

问题是用户如何从一个现有的数据基础架构转移到hadoop上,而这个基础架构是基于传统关系型数据库和SQL的?

hive提供了HiveQL方言来查询存储在hadoop集群中的数据。hive可以将大多数的查询转换为MapReduce作业。
select * from tb_user;

hive最适合于数据仓库,使用数据仓库进行相关的静态数据分析,而不需要快速响应给出结果,而且数据本身不会频繁变化。

hive不是一个完整的数据库。其中最大的限制就是hive不支持记录级别的更新、插入或者删除操作。但是可以将查询生成新表或者将查询结果导入到文件中。

hive查询延时比较严重。

hive不支持事务。

HiveQL并不符合ANSI SQL标准,和Oracle、MySQL、SQL
Server支持的常规SQL方言在很多方面存在差异,不过HiveQL和MySQL提供的SQL方言最接近

Apache
Hive™数据仓库软件有助于读取编写管理驻留在分布式存储中的大型数据集,并使用SQL语法进行查询

Hive构建于Apache Hadoop™之上,提供以下功能:

  • 通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析。

  • 一种在各种数据格式上强加结构的机制

  • 访问直接存储在Apache HDFS™或其他数据存储系统(如Apache HBase™)中的文件 hdfs
    dfs -ls /

  • 通过Apache Tez™,Apache Spark™或MapReduce执行查询

  • 使用HPL-SQL的过程语言

  • 通过Hive LLAP,Apache YARN和Apache Slider进行亚秒级查询检索。

Hive提供标准的SQL功能,包括具备SQL:2003,SQL:2011和SQL:2016的分析特性。

Hive的SQL也可以通过用户定义的函数(UDF),用户定义的聚合(UDAF)和用户定义的表函数(UDTF)使用用户代码进行扩展。

Hive不适用于联机事务处理(OLTP)工作负载。它最适用于传统的数据仓库任务

Hive旨在最大限度地提高可伸缩性(通过动态添加到Hadoop集群中的更多计算机扩展),性能,可扩展性,容错性以及与其输入格式的松耦合

Hive的组件包括HCatalog和WebHCat。

HCatalog是Hadoop的表和存储管理层,它使具有不同数据处理工具(包括Pig和MapReduce)的用户能够更轻松地在网格上读写数据。

WebHCat提供了一种服务,可用于运行Hadoop MapReduce(或YARN),Pig,Hive作业。
您还可以使用HTTP(REST样式)接口执行Hive元数据操作。

数据仓库

数据仓库是信息(对其进行分析可做出更明智的决策)的中央存储库。通常,数据定期从事务系统、关系数据库和其他来源流入数据仓库。业务分析师、数据科学家和决策者通过商业智能
(BI) 工具、SQL 客户端和其他分析应用程序访问数据

数据和分析已然成为各大企业保持竞争力所不可或缺的部分。他们使用报告、控制面板和分析工具从其数据中获得洞察力、监控企业绩效以及更明智地决策。这些报告、控制面板和分析工具由数据仓库提供支持;数据仓库可以高效地存储数据以便最大限度地减少
I/O,并以极快的速度同时向成千上万的用户提供查询结果

hive给不会写mapreduce的人使用的,SQL

hive架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzrrKnpW-1618233378248)(media/beaa5b310a6c287ad95aaf679a8e1e13.png)]

用户接口主要有三个:CLI,Client 和
WebUI(hwi)。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive
Server。在启动 Client模式的时候,需要指出Hive
Server所在节点,并且在该节点启动Hive Server。 WebUI是通过浏览器访问Hive。

Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。

Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select
* from tbl不会生成MapRedcue任务)。

  1. 编译器将一个Hive SQL转换操作符

  2. 操作符是Hive的最小的处理单元

  3. 每个操作符代表HDFS的一个操作或者一个MapReduce作业

antlr词法语法分析工具解析hql

HQL

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h26ig38t-1618233378251)(media/410edd434aec66930a10bc9b3c8de587.png)]

执行流程(理解)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4RJOCU67-1618233378253)(media/a516f70c0a7063015e4246b1222e7d2a.png)]

1、UI调用驱动程序的执行接口(图1中的步骤1)。

2、驱动程序为查询创建会话句柄,并将查询发送到编译器以生成执行计划(步骤2)。

3、编译器从Metastore获取必要的元数据(步骤3和4)。此元数据用于检查查询树中的表达式以及基于查询谓词的修剪分区。

4、由编译器生成的计划(步骤5)是阶段的DAG(有向无环图),其中每个阶段是mapreduce作业或者元数据操作或者对HDFS的操作。对于map/reduce阶段,计划包含map运算符树(在mapper上执行的运算符树)和reduce运算符树(用于需要reducer的操作)。

5、执行引擎将这些阶段提交给适当的组件(步骤6,6.1,6.2和6.3)。在每个任务(Mapper/Reducer)中,与表或中间输出相关联的反序列化器用于从HDFS文件中读取行,这些行通过关联的运算符树传递。生成输出后,它将通过序列化程序写入临时HDFS文件(如果操作不需要reducer,则会在mapper中发生)。临时文件用于向计划的后续mapreduce阶段提供数据。对于DML操作,最终临时文件将移动到表的位置。此方案用于确保不读取脏数据(文件重命名是HDFS中的原子操作)。

6、对于查询,执行引擎直接从HDFS读取临时文件的内容,作为来自驱动程序的查询的一部分(步骤7,8和9)。

hive搭建模式及搭建

hive三种方式区别和搭建

Hive中metastore的三种方式:

  1. 内嵌Derby方式

    1. 使用内嵌的默认元数据数据库Derby,单进程访问
  2. Local方式

    1. 使用其他的关系型数据库,该关系型数据库和hive在同一个节点
  3. Remote方式

    1. 使用其他的关系型数据库,该关系型数据库和hive不在同一个节点
1.本地单用户模式(derby)

这种方式是最简单的存储方式,只需要在hive-site.xml做如下配置便可

以下配置可写可不写,不写就是默认值 注意:ctrl-v+ctrl-a

<?xml version=“1.0”?> <?xml-stylesheet type=“text/xsl” href=“configuration.xsl”?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration>

需要将hadoop/share/hadoop/yarn/lib中的jline-0.94.0.jar替换为hive中的jline-2.12.jar,四台hadoop都换。

注:使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误

hive> show tables;

FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start
database ‘metastore_db’, see the next exception for details.

NestedThrowables:

java.sql.SQLException: Failed to start database ‘metastore_db’, see the next
exception for details.

FAILED: Execution Error, return code 1 from
org.apache.hadoop.hive.ql.exec.DDLTask

2.本地多用户模式(mysql)

这种存储方式需要本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下)。

hive-site.xml

<?xml version=“1.0”?> <?xml-stylesheet type=“text/xsl” href=“configuration.xsl”?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive_mysql/warehouse</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive</value> </property> </configuration>

附:

安装mysql

yum install mysql-server -y

修改mysql权限:

GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘123’ WITH GRANT
OPTION;

flush privileges;

刷新权限

[ERROR] Terminal initialization failed; falling back to unsupported

java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but
interface was expected

at jline.TerminalFactory.create(TerminalFactory.java:101)

错误的原因: Hadoop jline版本和hive的jline不一致

3.多用户模式
1.Remote一体

这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动metastore服务。

这里用node4节点上的mysql服务器,新建hive_remote数据库,字符集是UTF8

<?xml version=“1.0”?>

<?xml-stylesheet type=“text/xsl” href=“configuration.xsl”?>

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive_rone/warehouse</value>

</property>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://node4/hive_rone?createDatabaseIfNotExist=true</value>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>hivehive</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>hive</value>

</property>

<property>

<name>hive.metastore.uris</name>

<value>thrift://node2:9083</value>

</property>

</configuration>

注:这里把hive的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,在启动的时候,需要先启动metastore服务

bin/hive --service metastore

bin/hive

./hive --help

2.Remote分离

将hive-site.xml配置文件拆为如下两部分

1)、服务端配置文件

<?xml version=“1.0”?>

<?xml-stylesheet type=“text/xsl” href=“configuration.xsl”?>

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node4/hive?createDatabaseIfNotExist=true</value>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>hivehive</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>hive</value>

</property>

</configuration>

2)、客户端配置文件

<?xml version=“1.0”?>

<?xml-stylesheet type=“text/xsl” href=“configuration.xsl”?>

<configuration>

<property>

<name>hive.metastore.uris</name>

<value>thrift://node2:9083</value>

</property>

</configuration>

启动hive服务端程序

hive --service metastore

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

root@node2:~# hive

Hive history file=/tmp/root/hive_job_log_root_201301301416_955801255.txt

hive> show tables;

OK

test_hive

Time taken: 0.736 seconds

hive>

客户端启动的时候要注意:

[ERROR] Terminal initialization failed; falling back to unsupported

java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but
interface was expected

at jline.TerminalFactory.create(TerminalFactory.java:101)

错误的原因: Hadoop jline版本和hive的jline不一致

hiveSQL(HQL)

hive的数据类型

数值型

TINYINT (1-byte 有符号整数, 从-128到127)

SMALLINT (2-byte有符号整数, 从-32,768到32,767)

INT/INTEGER (4-byte有符号整数, 从-2,147,483,648到2,147,483,647)

BIGINT (8-byte有符号整数,
从-9,223,372,036,854,775,808到9,223,372,036,854,775,807)

FLOAT (4-byte单精度浮点数)

DOUBLE (8-byte双精度浮点数)

DOUBLE PRECISION (DOUBLE别名, 从Hive 2.2.0开始支持)

DECIMAL 从Hive 0.11.0开始支持的最大38位精度,Hive
0.13.0开始用户可以指定小数位。decimal(5,3) 12.345

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLoy7ZBg-1618233378257)(media/3f1f6dca900b180f3a1cbf629cecc4e1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O5D0OqoD-1618233378259)(media/a09378d64854d472cea9802b05dd8098.png)]

NUMERIC (类似于DECIMAL, 从Hive 3.0.0开始支持)

日期时间类型

TIMESTAMP (从Hive 0.8.0开始支持) 年月日时分秒毫秒

DATE (从Hive 0.12.0开始支持) 年月日

INTERVAL (从Hive 1.2.0开始支持)

String类型

STRING

VARCHAR (从Hve 0.12.0开始支持)

CHAR (从Hive 0.13.0开始支持)

其他类型

BOOLEAN

BINARY (从Hive 0.8.0开始支持)

复合类型

数组: ARRAY<data_type> (Note: negative values and non-constant expressions are
allowed as of Hive 0.14.)

maps: MAP<primitive_type, data_type> (Note: negative values and non-constant
expressions are allowed as of Hive 0.14.)

structs: STRUCT<col_name : data_type [COMMENT col_comment], …>

union: UNIONTYPE<data_type, data_type, …> (Note: 从Hive 0.7.0.开始支持)

union支持不完整,略

整数类型

(TINYINT, SMALLINT, INT/INTEGER, BIGINT)

整数类型默认是INT类型,除非数字超出了INT的范围,被解析为BIGINT类型。但是可以指定后缀:

类型后缀示例
TINYINTY100Y
SMALLINTS100S
BIGINTL100L

从Hive 2.2.0开始INTEGER作为INT的同义词。

字符串

是单引号或双引号引起来的字符序列。 “tom’s cat”

Timestamp类型

支持UNIX类型的时间精确到毫秒。System.currentTimeMills()

支持的转换:

整数类型:解释为UNIX中的秒 1234567887

浮点类型:解释为带小数的UNIX时间秒

String类型: JDBC中java.sql.Timestamp兼容格式"YYYY-MM-DD HH:MM:SS.fffffffff"
(9位小数精确度)

create table dual (x string);

insert into table dual values(‘1’);

select * from dual;

select 1+1 from dual;

示例程序

create table tb_timestamp ( id int, mytime timestamp ); from dual insert into tb_timestamp select 1, ‘1998-12-23 23:34:45’ limit 1 from dual insert into tb_timestamp select 2, cast(‘1999-1-12 12:34:45’ as timestamp) limit 1

需要保证dual存在,同时dual中至少有一条记录。

日期:

DATE类型数据表示year/month/day, 格式为YYYY-MM-DD. 例如:DATE ‘2013-01-01’。
Date类型不包含时间. Date类型支持从0000-01­01到9999-12-31。

日期转换操作:
日期转换结果
cast(date as date)相同的日期值
cast(timestamp as date)根据当前时区解析出timestamp中年/月/日作为日期类型。
cast(string as date)如果string是’YYYY-MM-DD’格式, 返回其中的年/月/日。否则返回NULL。
cast(date as timestamp)返回date日期下的零点零分零秒的timestamp类型数据。
cast(date as string)年/月/日转换为’YYYY-MM-DD’类型的字符串。

示例程序

create table tb_datetest ( id int, mytime date ); from dual insert into tb_datetest select 2, cast(‘1998-12-23’ as date) limit 1; from dual insert into tb_datetest select 3, ‘1998-12-23’ limit 1;
insert into tb_datetest values(4, ‘1998-12-23’); 少用
Decimals
  1. Hive 0.11和0.12中DECIMAL类型限制为38位。

在Hive 0.13中用户可以指定位数和精度:DECIMAL(precision, scale).
如果小数位没有指定,默认为0,如果位数没有指定,则默认是10.

NULL值的处理

没有的值是NULL。

hive的数据库操作

hive命令行的清屏命令:hive > !clear;

创建数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_name=property_value, …)];

示例程序:

hive> create database mydb; OK Time taken: 0.067 seconds hive> show databases; OK default mydb Time taken: 0.032 seconds, Fetched: 2 row(s) hive> create database mydb1 comment ‘my db one’ location ‘/user/hive/mydb1’; OK Time taken: 0.045 seconds hive> desc database extended mydb1; OK mydb1 my db one hdfs://mycluster/user/hive/mydb1 root USER Time taken: 0.047 seconds, Fetched: 1 row(s) hive> create database mydb2 comment ‘my db two’ location ‘/user/hive/mymydbdb2’ with dbproperties (‘key1’=‘value1’, ‘key2’ = ‘value2’); OK Time taken: 0.077 seconds hive> desc database extended mydb2; OK mydb2 my db two hdfs://mycluster/user/hive/mymydbdb2 root USER {key1=value1, key2=value2} Time taken: 0.036 seconds, Fetched: 1 row(s) hive> show databases; OK default mydb1 mydb2 Time taken: 0.017 seconds, Fetched: 3 row(s) hive> create database mydb1; FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database mydb1 already exists hive> create database if not exists mydb1; OK Time taken: 0.011 seconds hive> show databases; OK default mydb1 mydb2 Time taken: 0.02 seconds, Fetched: 3 row(s) hive> create schema mydb3; OK Time taken: 0.064 seconds hive> show databases; OK default mydb1 mydb2 mydb3 Time taken: 0.019 seconds, Fetched: 4 row(s)

desc database <dbname>;查看数据库的描述信息

desc database extended <dbname>;查看数据库的详情

删除数据库
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

示例程序

hive> create database mydb3; OK Time taken: 0.064 seconds hive> use mydb3; OK Time taken: 0.027 seconds hive> show tables; OK Time taken: 0.042 seconds hive> show databases; OK default mydb mydb1 mydb2 mydb3 Time taken: 0.032 seconds, Fetched: 5 row(s) hive> use mydb3; OK Time taken: 0.026 seconds hive> show tables; OK Time taken: 0.039 seconds hive> drop database mydb3; OK Time taken: 0.062 seconds hive> show databases; OK default mydb mydb1 mydb2 Time taken: 0.02 seconds, Fetched: 4 row(s) hive> use mydb; OK Time taken: 0.023 seconds hive> show tables; OK Time taken: 0.029 seconds hive> create table tb_test (id int, name string, age int); OK Time taken: 0.105 seconds hive> show tables; OK tb_test Time taken: 0.032 seconds, Fetched: 1 row(s) hive> drop database mydb; FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database mydb is not empty. One or more tables exist.) hive> drop database mydb restrict; FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database mydb is not empty. One or more tables exist.) hive> drop database mydb cascade; OK Time taken: 0.181 seconds hive> show databases; OK default mydb1 mydb2 Time taken: 0.015 seconds, Fetched: 3 row(s) hive> show databases; OK default mydb1 mydb2 Time taken: 0.02 seconds, Fetched: 3 row(s) hive> drop database mydb4; FAILED: SemanticException [Error 10072]: Database does not exist: mydb4 hive> drop database if exists mydb4; OK Time taken: 0.011 seconds
修改数据库
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, …); ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;

示例程序

hive> desc database extended mydb1; OK mydb1 my db one hdfs://mycluster/user/hive/mydb1 root USER Time taken: 0.045 seconds, Fetched: 1 row(s) hive> alter database mydb1 set dbproperties(‘key1’=‘value1’,‘key2’=‘value2’); OK Time taken: 0.051 seconds hive> desc database extended mydb1; OK mydb1 my db one hdfs://mycluster/user/hive/mydb1 root USER {key1=value1, key2=value2} Time taken: 0.035 seconds, Fetched: 1 row(s) hive> desc database extended mydb1; OK mydb1 my db one hdfs://mycluster/user/hive/mydb1 root USER {key1=value1, key2=value2} Time taken: 0.035 seconds, Fetched: 1 row(s) hive> alter database mydb1 set owner user myhive; OK Time taken: 0.04 seconds hive> desc database extended mydb1; OK mydb1 my db one hdfs://mycluster/user/hive/mydb1 myhive USER {key1=value1, key2=value2} Time taken: 0.023 seconds, Fetched: 1 row(s) hive> alter database mydb1 set owner role myrole; OK Time taken: 0.042 seconds hive> desc database extended mydb1; OK mydb1 my db one hdfs://mycluster/user/hive/mydb1 myrole ROLE {key1=value1, key2=value2} Time taken: 0.03 seconds, Fetched: 1 row(s)
使用数据库
USE database_name; USE DEFAULT;

hive的表操作

创建表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type [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, …) 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 (…)] ] [LOCATION hdfs_path] [TBLPROPERTIES (property_name=property_value, …)] [AS select_statement]; – (Note: not supported for external tables) CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name LIKE existing_table_or_view_name [LOCATION hdfs_path]; data_type : primitive_type | array_type | map_type | struct_type | union_type primitive_type : TINYINT | SMALLINT | INT | BIGINT | BOOLEAN | FLOAT | DOUBLE | STRING | BINARY | TIMESTAMP | DECIMAL | DECIMAL(precision, scale) | DATE | VARCHAR | CHAR 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, … > 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, …)] file_format: : SEQUENCEFILE | TEXTFILE – (Default, depending on hive.default.fileformat configuration) | RCFILE | ORC | PARQUET | AVRO | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname constraint_specification: : [, PRIMARY KEY (col_name, …) DISABLE NOVALIDATE ] [, CONSTRAINT constraint_name FOREIGN KEY (col_name, …) REFERENCES table_name(col_name, …) DISABLE NOVALIDATE

ctrlv+ctrla ^A分隔符

示例程序

hive> use mydb1; OK Time taken: 0.029 seconds hive> show tables; OK Time taken: 0.027 seconds hive> create table tb_user1 (id int, name string, age int); OK Time taken: 0.08 seconds hive> show tables; OK tb_user1 Time taken: 0.032 seconds, Fetched: 1 row(s)
hive> create external table tb_user11 (id int, name string, age int); OK Time taken: 0.114 seconds
hive> show tables; OK tb_user1 Time taken: 0.029 seconds, Fetched: 1 row(s) hive> create table tb_user2 (id int, name string, age int, likes array<string>, addrs map<string, string>); OK Time taken: 0.107 seconds hive> desc tb_user2; OK id int name string age int likes array<string> addrs map<string,string> Time taken: 0.112 seconds, Fetched: 5 row(s)
hive> create table tb_user3 (id int, name string, age int, likes array<string>, addrs map<string, string>) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’ lines terminated by ‘\n’; OK Time taken: 0.084 seconds hive> desc formatted tb_user3; 查看表详情
hive> create table tb_user4 (id int, name string, age int, likes array<string>, addrs map<string, string>) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’ lines terminated by ‘\n’ stored as SEQUENCEFILE; OK Time taken: 0.095 seconds
hive> create table tb_user5 (id int, name string, age int, likes array<string>, addrs map<string, string>) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’ lines terminated by ‘\n’ stored as SEQUENCEFILE location ‘/user/hive/u5’; OK Time taken: 0.096 seconds
hive> create table tb_user6 (id int, name string, age int, likes array<string>, addrs map<string, string>) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’ lines terminated by ‘\n’ stored as SEQUENCEFILE location ‘/user/hive/u6’ tblproperties(‘key1’=‘value1’,‘key2’=‘value2’); OK Time taken: 0.084 seconds
存储格式
存储格式描述
INPUTFORMAT and OUTPUTFORMAT在file_format部分使用字符串指定InputFormat和OutputFormat类 例如:’ org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat’ 对于LZO压缩,使用的值是: ‘INPUTFORMAT “com.hadoop.mapred.DeprecatedLzoTextInputFormat” OUTPUTFORMAT “org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat”’
STORED AS AVRO在hive0.14.0及之后的版本中使用Avro格式存储数据
STORED AS SEQUENCEFILE使用压缩的序列文件存储
STORED AS JSONFILE在hive4.0.0及之后使用json文件格式存储
STORED AS ORC使用ORC文件格式存储。支持ACID事务并且做了基于资源的优化。存储列级别的元数据
STORED AS PARQUET在hive0.13.0及之后版本使用Parquet格式存储Parquet列存储格式
STORED AS TEXTFILE以普通文本文件格式存储。TEXTFILE是默认的文件格式,除非使用hive.default.fileformat指定一个不同的格式。使用DELIMITED子句指定标记的文件。 ESCAPED BY子句(如ESCAPED BY ‘\’)可以对标记字符启用逃逸。
STORED AS RCFILE使用列记录文件格式存储
STORED BY使用非本地表格式存储。要创建或链接到非本地表,例如HBase或Druid或Accumulo中的表。

内部表和外部表Managed vs. External Tables

内部表和外部表

内部表:

默认情况下,内部表存储于hive.metastore.warehouse.dir属性指定的路径下,即/user/hive/warehouse/databasename.db/tablename/目录。默认路径可以通过location属性在建表的时候指定。如果内部表或分区删除了,跟该表或分区关联的数据和元数据一并删除。如果没有指定PURGE选项,则数据会先移动到垃圾桶待指定的时间。

如果希望hive管理表的生命周期,或者是临时表,则使用内部表。

外部表:

外部表在外部文件存储元数据以及表结构(mysql)。外部表文件可以被外部进程管理和访问。外部表可以访问存储于Azure
Storage
Volumes(ASV)或者远程HDFS上的数据。如果外部表的结构或者分区发生改变,则通过MSCK
REPAIR TABLE table_name语句修复和刷新元数据信息。

如果数据是已经存在或者存储与远程,或者当表删除后不希望删除数据,就可以使用外部表。

hive查看表描述

DESCRIBE [EXTENDED|FORMATTED] table_name

hive建表的like和as

Create Table Like:

CREATE TABLE empty_key_value_store LIKE key_value_store;

Create Table As Select (CTAS)

CREATE TABLE new_key_value_store

AS

SELECT columA, columB FROM key_value_store;

示例程序

数据: 1,小明1,lol-book-movie,beijing:xisanqi-shanghai:pudong 2,小明2,lol-book-movie,beijing:xisanqi-shanghai:pudong 3,小明3,lol-book-movie,beijing:xisanqi-shanghai:pudong 4,小明4,lol-book-movie,beijing:xisanqi-shanghai:pudong 5,小明5,lol-movie,beijing:xisanqi-shanghai:pudong 6,小明6,lol-book-movie,beijing:xisanqi-shanghai:pudong 7,小明7,lol-book,beijing:xisanqi-shanghai:pudong 8,小明8,lol-book,beijing:xisanqi-shanghai:pudong 9,小明9,lol-book-movie,beijing:xisanqi-shanghai:pudong
hive> create table tb_userx (id int, name string, likes array<string>, addrs map<string, string>) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’ lines terminated by ‘\n’; OK Time taken: 0.082 seconds hive> load data local inpath ‘/root/users.txt’ into table tb_userx; Loading data to table mydb1.tb_userx Table mydb1.tb_userx stats: [numFiles=1, totalSize=505] OK Time taken: 0.287 seconds hive> select * from tb_userx; OK 1 小明1 [“lol”,“book”,“movie”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} 2 小明2 [“lol”,“book”,“movie”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} 3 小明3 [“lol”,“book”,“movie”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} 4 小明4 [“lol”,“book”,“movie”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} 5 小明5 [“lol”,“movie”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} 6 小明6 [“lol”,“book”,“movie”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} 7 小明7 [“lol”,“book”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} 8 小明8 [“lol”,“book”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} 9 小明9 [“lol”,“book”,“movie”] {“beijing”:“xisanqi”,“shanghai”:“pudong”} Time taken: 0.078 seconds, Fetched: 9 row(s) hive> create table tb_userxx like tb_userx; OK Time taken: 0.109 seconds hive> select * from tb_userxx; OK Time taken: 0.081 seconds
hive> create table tb_userxxx as select id, name, addrs from tb_userx; Query ID = root_20190918011634_0d71a70c-c56e-4505-ac4a-d343c6501c09 Total jobs = 3 Launching Job 1 out of 3 Number of reduce tasks is set to 0 since there’s no reduce operator Starting Job = job_1568737356836_0001, Tracking URL = http://node3:8088/proxy/application_1568737356836_0001/ Kill Command = /opt/hadoop-2.6.5/bin/hadoop job -kill job_1568737356836_0001 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0 2019-09-18 01:16:47,954 Stage-1 map = 0%, reduce = 0% 2019-09-18 01:16:57,505 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.22 sec MapReduce Total cumulative CPU time: 1 seconds 220 msec Ended Job = job_1568737356836_0001 Stage-4 is selected by condition resolver. Stage-3 is filtered out by condition resolver. Stage-5 is filtered out by condition resolver. Moving data to: hdfs://mycluster/user/hive/mydb1/.hive-staging_hive_2019-09-18_01-16-34_061_6209103026839086288-1/-ext-10001 Moving data to: hdfs://mycluster/user/hive/mydb1/tb_userxxx Table mydb1.tb_userxxx stats: [numFiles=1, numRows=9, totalSize=378, rawDataSize=369] MapReduce Jobs Launched: Stage-Stage-1: Map: 1 Cumulative CPU: 1.22 sec HDFS Read: 3685 HDFS Write: 451 SUCCESS Total MapReduce CPU Time Spent: 1 seconds 220 msec OK Time taken: 24.763 seconds hive> select * from tb_userxxx; OK 1 小明1 {“beijing”:“xisanqi”,“shanghai”:“pudong”} 2 小明2 {“beijing”:“xisanqi”,“shanghai”:“pudong”} 3 小明3 {“beijing”:“xisanqi”,“shanghai”:“pudong”} 4 小明4 {“beijing”:“xisanqi”,“shanghai”:“pudong”} 5 小明5 {“beijing”:“xisanqi”,“shanghai”:“pudong”} 6 小明6 {“beijing”:“xisanqi”,“shanghai”:“pudong”} 7 小明7 {“beijing”:“xisanqi”,“shanghai”:“pudong”} 8 小明8 {“beijing”:“xisanqi”,“shanghai”:“pudong”} 9 小明9 {“beijing”:“xisanqi”,“shanghai”:“pudong”} Time taken: 0.078 seconds, Fetched: 9 row(s)

hive的分区

可以使用PARTITIONED
BY子句创建分区表。一个表可以有一个或多个分区列,对于分区列,每个不同的列值创建一个单独的数据目录。另外,表或者分区还可以使用CLUSTERED
BY子句分桶,还可以使用SORT
BY子句对桶内的数据进行排序。这样可以提高一些查询的性能。

如果在创建分区表的时候报错:“FAILED: Error in semantic analysis: Column repeated
in partitioning
columns”表示分区列已经在表字段中定义了。分区会创建可查询的伪列。如果伪列和表定义中的列名冲突,取不同的列名。

分区为了方便查询,加快查询

创建分区表

必须在表定义时指定对应的partition字段

a、单分区建表语句:

  1. create table day_table (id int, content string) partitioned by (dt string);

    1. 单分区表,按天分区,在表结构中存在id,content,dt三列。

    2. 以dt为文件夹区分

b、 双分区建表语句:

  1. create table day_hour_table (id int, content string) partitioned by (dt
    string, hour string);

    1. 双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。

    2. 先以dt为文件夹,再以hour子文件夹区分

CREATE TABLE page_view(viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ip STRING COMMENT ‘IP Address of the User’) COMMENT ‘This is the page view table’ PARTITIONED BY(dt STRING, country STRING);

假设文件中字段分隔符是ctrl-V-Ctrl-A,行分隔符是换行符:

CREATE TABLE page_view(viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ip STRING COMMENT ‘IP Address of the User’) COMMENT ‘This is the page view table’ PARTITIONED BY(dt STRING, country STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\001’ 等价于^A

示例程序

hive> create table tb_user1 (id int, name string, likes array<string>, addrs map<string, string>) partitioned by (age int) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’ lines terminated by ‘\n’; OK Time taken: 0.372 seconds hive> show tables; OK tb_user1 Time taken: 0.036 seconds, Fetched: 1 row(s) hive> desc tb_user1; OK id int name string likes array<string> addrs map<string,string> age int # Partition Information # col_name data_type comment age int Time taken: 0.176 seconds, Fetched: 10 row(s);
hive> create table tb_user2 (id int, name string, likes array<string>, addrs map<string, string>) partitioned by (age int, sex string) row format delimited fields terminated by ‘,’ collection items terminated by ‘-’ map keys terminated by ‘:’ lines terminated by ‘\n’; OK Time taken: 0.104 seconds hive> desc tb_user2; OK id int name string likes array<string> addrs map<string,string> age int sex string # Partition Information # col_name data_type comment age int sex string Time taken: 0.134 seconds, Fetched: 12 row(s)

Hive添加分区表语法

实际上只是创建文件夹,文件夹内没有数据文件

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION ‘location’][, PARTITION partition_spec [LOCATION ‘location’], …]; partition_spec: : (partition_column = partition_col_value, partition_column = partition_col_value, …)

(表已创建,在此基础上添加分区):

示例程序

hive> alter table tb_user1 add partition (age=10) location ‘/user/hive’; OK Time taken: 0.239 seconds hive> load data local inpath ‘/root/users.txt’ into table tb_user1 partition (age=10); Loading data to table mydb2.tb_user1 partition (age=10) Partition mydb2.tb_user1{age=10} stats: [numFiles=3, numRows=0, totalSize=1388, rawDataSize=0] OK Time taken: 1.836 seconds

Hive删除分区语法

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION
partition_spec, …]

[IGNORE PROTECTION] [PURGE]; – (Note: PURGE available in Hive 1.2.0 and later,
IGNORE PROTECTION not available 2.0.0 and later)

内部表中、对应分区的元数据和数据将被一并删除。

示例程序

hive> alter table tb_user1 drop partition (age=10); Dropped the partition age=10 OK Time taken: 0.625 seconds

Hive向指定分区添加数据语法

LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 …)]

例:

LOAD DATA INPATH ‘/user/pv.txt’ INTO TABLE day_hour_table
PARTITION(dt=‘2008-08- 08’, hour=‘08’);

LOAD DATA local INPATH ‘/user/hua/*’ INTO TABLE day_hour
partition(dt=‘2010-07- 07’);

当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录

Hive查询执行分区语法

SELECT day_table.* FROM day_table WHERE day_table.dt>= ‘2008-08-08’;

分区表的意义在于优化查询。查询时尽量利用分区字段。如果不使用分区字段,就会全部扫描。

Hive查询表的分区信息语法

SHOW PARTITIONS day_hour_table;

预先导入分区数据,但是无法识别怎么办

方案1、Msck repair table tablename

方案2、直接添加分区

hive的DML

加载文件中的数据到表:

LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION
(partcol1=val1, partcol2=val2 …)]

对于加载本地文件,需要发生文件的上传,文件从本地上传到hdfs。

对于hdfs的文件,load的时候直接修改文件的路径,不发生文件的拷贝,块。

标准语法:

覆盖

INSERT (OVERWRITE|INTO) TABLE tablename1

[PARTITION (partcol1=val1, partcol2=val2 …)

[IF NOT EXISTS]]

select_statement1 FROM from_statement;

追加

INSERT (OVERWRITE|INTO) TABLE tablename1

[PARTITION (partcol1=val1, partcol2=val2 …)]

select_statement1 FROM from_statement;

Hive扩展 (多个插入记录):

FROM from_statement

INSERT (OVERWRITE|INTO) TABLE tablename1

[PARTITION (partcol1=val1, partcol2=val2 …)

[IF NOT EXISTS]]

select_statement1

[INSERT (OVERWRITE|INTO) TABLE tablename2

[PARTITION … [IF NOT EXISTS]]

select_statement2]

[INSERT (OVERWRITE|INTO) TABLE tablename2

[PARTITION …]

select_statement2] …;

Hive扩展 (动态分区插入记录):

INSERT OVERWRITE TABLE tablename

PARTITION (partcol1[=val1], partcol2[=val2] …)

select_statement FROM from_statement;

INSERT INTO TABLE tablename

PARTITION (partcol1[=val1], partcol2[=val2] …)

select_statement FROM from_statement;

示例程序

from tb_userx insert into table tb_userx select 10, ‘john’, array(‘hello’,‘world’,‘ok’), map(‘a’,‘valuea’,‘b’,‘valueb’) limit 1; from tb_userx insert overwrite table tb_userx select 11, ‘john’, array(‘hello’,‘world’,‘ok’), map(‘a’,‘valuea’,‘b’,‘valueb’) limit 1;

注意:tb_userx中必须至少有一条记录,才可以limit 1。

Delete

Update

Deletes can only be performed on tables that support ACID. See Hive Transactions
for details.

hive的SerDe

Hive SerDe - Serializer and Deserializer

  1. SerDe 用于做序列化和反序列化。

  2. 构建在数据存储和执行引擎之间,对两者实现解耦。

  3. Hive通过ROW FORMAT DELIMITED以及SERDE进行内容的读写。

row_format
DELIMITED

[FIELDS TERMINATED BY char [ESCAPED 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正则匹配

CREATE TABLE logtbl (

host STRING,

identity STRING,

t_user STRING,

time STRING,

request STRING,

referer STRING,

agent STRING)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe’

WITH SERDEPROPERTIES (

"input.regex" = “([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \”(.*)\"
(-|[0-9]*) (-|[0-9]*)"

)

STORED AS TEXTFILE;

注意:limit只能作为限制输出的语句,而不能直接用于分页,比如类似于mysql的:

selet * from tb_user limit 10, 5;

hive: select * from tb_user limit 5;

hive的Beeline

  1. Beeline 要与HiveServer2配合使用

  2. 服务端启动hiveserver2,服务端就是你启动metastore的节点

    1. bin/hive --service hiveserver2 启动hiveserver2
  3. 客户的通过beeline两种方式连接到hive

    1. 直接启动beeline连接指定的数据库

    2. beeline -u jdbc:hive2://localhost:10000/default -n root

    3. 启动beeline之后再连接数据库

    4. beeline

    5. beeline> !connect jdbc:hive2://<host>:<port>/<db>;auth=noSasl
      root 123

  4. 默认 用户名、密码不验证

  5. 在beeline中使用!close关闭到hiveserver2的连接

  6. 在beeline中使用!quit退出beeline

hive的JDBC操作

服务端启动hiveserver2后,在java代码中通过调用hive的jdbc访问默认端口10000进行连接、访问

首先需要在java项目中添加hive的jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NitF8QMJ-1618233378262)(media/556c69f23de4bbe58434b847545c1872.png)]

hive的函数

1.内置运算符

1.1关系运算符
运算符类型说明
A = B所有原始类型如果A与B相等,返回TRUE,否则FALSE
A == B无效的语法
A <> B所有原始类型如果A不等于B返回TRUE,否则FALSE。如果A或B值为“NULL",结果返回”NULL”
A < B所有原始类型如果A小于B返回TRUE,否则FALSE。如果A或B值为“NULL”,结果为“NULL”
A <= B所有原始类型如果A小于等于B,返回TRUE,否则FALSE。如果A或B值为“NULL”,返回“NULL”
A > B所有原始类型如果A大于B,返回TRUE,否则FALSE。如果A或B值为“NULL”,返回“NULL”
A >= B所有原始类型如果A大于等于B,返回TRUE,否则FALSE。如果A或B值为“NULL”,返回“NULL”
A IS NULL所有类型如果A值为”NULL”,返回TRUE,否则返回FALSE
A IS NOT NULL所有类型如果A值不为”NULL”,返回TRUE,否则返回FALSE
A LIKE B字符串如果A或B值为”NULL”,结果返回”NULL”。字符串A与B通过sql进行匹配,如果相符返回TRUE,不符返回FALSE。B字符串中的””代表任一字符,”%”则代表多个任意字符。例如:(‘foobar’ like ‘foo’)返回FALSE,(‘foobar’ like ‘foo__’或者‘foobar’ like ‘foo%’)则返回TURE
A RLIKE B字符串如果A或B值为”NULL”,结果返回”NULL”。字符串A与B通过java进行匹配,如果相符返回TRUE,不符返回FALSE。例如:(‘foobar’ rlike ‘foo’)返回FALSE,(’foobar’ rlike ‘^f.*r$’ )返回TRUE。
A REGEXP B字符串与RLIKE相同。
1.2算术运算符
运算符类型说明
A + B所有数字类型A和B相加。结果的与操作数值有共同类型。例如每一个整数是一个浮点数,浮点数包含整数。所以,一个浮点数和一个整数相加结果也是一个浮点数。
A – B所有数字类型A和B相减。结果的与操作数值有共同类型。
A * B所有数字类型A和B相乘,结果的与操作数值有共同类型。需要说明的是,如果乘法造成溢出,将选择更高的类型。
A / B所有数字类型A和B相除,结果是一个double(双精度)类型的结果。
A % B所有数字类型A除以B余数与操作数值有共同类型。
A & B所有数字类型运算符查看两个参数的二进制表示法的值,并执行按位”与”操作。两个表达式的一位均为1时,则结果的该位为1。否则,结果的该位为0。
A|B所有数字类型运算符查看两个参数的二进制表示法的值,并执行按位”或”操作。只要任一表达式的一位为1,则结果的该位为1。否则,结果的该位为0。
A ^ B所有数字类型运算符查看两个参数的二进制表示法的值,并执行按位”异或”操作。当且仅当只有一个表达式的某位上为1 时,结果的该位才为1。否则结果的该位为0。
~A所有数字类型对一个表达式执行按位”非”(取反)。
1.3逻辑运算符
运算符类型说明
A AND B布尔值A和B同时正确时,返回TRUE,否则FALSE。如果A或B值为NULL,返回NULL。
A && B布尔值与”A AND B”相同
A OR B布尔值A或B正确,或两者同时正确返返回TRUE,否则FALSE。如果A和B值同时为NULL,返回NULL。
A | B布尔值与”A OR B”相同
NOT A布尔值如果A为NULL或错误的时候返回TURE,否则返回FALSE。
! A布尔值与”NOT A”相同
1.4复杂类型函数
函数类型说明
map(key1, value1, key2, value2, …)通过指定的键/值对,创建一个map。
struct(val1, val2, val3, …)通过指定的字段值,创建一个结构。结构字段名称将COL1,COL2,…
array(val1, val2, …)通过指定的元素,创建一个数组。
1.5对复杂类型函数操作
函数类型说明
A[n]A是一个数组,n为int型返回数组A的第n个元素,第一个元素的索引为0。如果A数组为[‘foo’,‘bar’],则A[0]返回’foo’和A[1]返回”bar”。
M[key]M是Map<K, V>,键K型返回关键值对应的值,例如mapM为 \{‘f’ -> ‘foo’, ‘b’ -> ‘bar’, ‘all’ -> ‘foobar’\},则M[‘all’] 返回’foobar’。
S.xS为struct返回结构x字符串在结构S中的存储位置。如 foobar \{int foo, int bar\} foobar.foo的领域中存储的整数。

2.内置函数

2.1数学函数
返回类型函数说明
BIGINTround(double a)四舍五入
DOUBLEround(double a,int d)小数部分d位之后数字四舍五入,例如round(21.263,2),返回21.26
BIGINTfloor(double a)对给定数据进行向下舍入最接近的整数。例如floor(21.2),返回21。
BIGINTceil(double a), ceiling(double a)将参数向上舍入为最接近的整数。例如ceil(21.2),返回23.
doublerand(), rand(int seed)返回大于或等于0且小于1的平均分布随机数(依重新计算而变)
doubleexp(double a)返回e的n次方
doubleln(double a)返回给定数值的自然对数
doublelog10(double a)返回给定数值的以10为底自然对数
doublelog2(double a)返回给定数值的以2为底自然对数
doublelog(double base, double a)返回给定底数及指数返回自然对数
doublepow(double a, double p) power(double a, double p)返回某数的乘幂
doublesqrt(double a)返回数值的平方根
stringbin(BIGINT a)返回二进制格式
stringhex(BIGINT a) hex(string a)将整数或字符转换为十六进制格式
stringunhex(string a)十六进制字符转换由数字表示的字符。
stringconv(BIGINT num, int from_base, int to_base)将指定数值由原来的度量体系转换为指定的度量体系。例如CONV(‘a’,16,2),返回。将16进制的a转换为2进制表示。
doubleabs(double a)取绝对值
int doublepmod(int a, int b) pmod(double a, double b)返回a除b的余数的绝对值
doublesin(double a)返回给定角度的正弦值
doubleasin(double a)返回x的反正弦,即是X。如果X是在-1到1的正弦值,返回NULL。
doublecos(double a)返回余弦
doubleacos(double a)返回X的反余弦,即余弦是X,,如果-1<= A <= 1,否则返回null.
int doublenegative(int a) negative(double a)返回A的相反数,例如negative(2),返回-2。
2.2收集函数
返回类型函数说明
intsize(Map<K,V>)返回map类型的元素数量
intsize(Array<T>)返回数组类型的元素数量
select size(likes), size(addrs) from tb_user1 where id=3;
2.3类型转换函数
返回类型函数说明
指定 “type”cast(expr as <type>)类型转换。例如将字符”1″转换为整数:cast(‘1’ as bigint),如果转换失败返回NULL。
hive> select “1”+1 from tb_user1 limit 1; OK 2.0 Time taken: 0.131 seconds, Fetched: 1 row(s) hive> select cast(“1” as int)+1 from tb_user1 limit 1; OK 2 Time taken: 0.171 seconds, Fetched: 1 row(s) hive> select cast(“1” as double)+1 from tb_user1 limit 1; OK 2.0 Time taken: 0.156 seconds, Fetched: 1 row(s) hive> select cast(‘2019-04-23’ as date) from tb_user1 limit 1; OK 2019-04-23 Time taken: 0.152 seconds, Fetched: 1 row(s) hive> select year(cast(‘2019-04-23’ as date)) from tb_user1 limit 1; OK 2019 Time taken: 0.166 seconds, Fetched: 1 row(s)
2.4日期函数
返回类型函数说明
stringfrom_unixtime(bigint unixtime[, string format])UNIX_TIMESTAMP参数表示返回一个值’YYYY-MM–DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,这取决于是否是在一个字符串或数字语境中使用的功能。该值表示在当前的时区。
bigintunix_timestamp()如果不带参数的调用,返回一个Unix时间戳(从’1970- 01 – 01 00:00:00′到现在的UTC秒数)为无符号整数。
bigintunix_timestamp(string date)指定日期参数调用UNIX_TIMESTAMP(),它返回参数值’1970-01–01 00:00:00′到指定日期的秒数。
bigintunix_timestamp(string date, string pattern)指定时间输入格式,返回到1970年秒数:unix_timestamp(’2009-03-20′, ‘yyyy-MM-dd’) = 1237532400
stringto_date(string timestamp)返回时间中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″
stringto_dates(string date)给定一个日期date,返回一个天数(0年以来的天数)
intyear(string date)返回指定时间的年份,范围在1000到9999,或为”零”日期的0。
intmonth(string date)返回指定时间的月份,范围为1至12月,或0一个月的一部分,如’0000-00-00′或’2008-00-00′的日期。
intday(string date) dayofmonth(date)返回指定时间的日期
inthour(string date)返回指定时间的小时,范围为0到23。
intminute(string date)返回指定时间的分钟,范围为0到59。
intsecond(string date)返回指定时间的秒,范围为0到59。
intweekofyear(string date)返回指定日期所在一年中的星期号,范围为0到53。
intdatediff(string enddate, string startdate)两个时间参数的日期之差。
intdate_add(string startdate, int days)给定时间,在此基础上加上指定的时间段。
intdate_sub(string startdate, int days)给定时间,在此基础上减去指定的时间段。
hive> select unix_timestamp() from tb_user1 limit 1; OK 1569201586 Time taken: 0.143 seconds, Fetched: 1 row(s) hive> select unix_timestamp(‘1970-01-01 12:10:11’) from tb_user1 limit 1; OK 15011 Time taken: 0.124 seconds, Fetched: 1 row(s)
2.5条件函数
返回类型函数说明
Tif(boolean testCondition, T valueTrue, T valueFalseOrNull)判断是否满足条件,如果满足返回一个值,如果不满足则返回另一个值。
TCOALESCE(T v1, T v2, …)返回一组数据中,第一个不为NULL的值,如果均为NULL,返回NULL。
TCASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END当a=b时,返回c;当a=d时,返回e,否则返回f。
TCASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END当值为a时返回b,当值为c时返回d。否则返回e。
hive> select if(1>2,‘ok’,‘no ok’) from tb_user1 limit 1; OK no ok Time taken: 0.202 seconds, Fetched: 1 row(s) hive> select if(1<2,‘ok’,‘no ok’) from tb_user1 limit 1; OK ok Time taken: 0.165 seconds, Fetched: 1 row(s) select case id when 1 then “小明1” when 2 then ‘小明2’ else “随便” end from tb_user1;
2.6字符函数
返回类型函数说明
intlength(string A)返回字符串的长度
stringreverse(string A)返回倒序字符串
stringconcat(string A, string B…)连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串
stringconcat_ws(string SEP, string A, string B…)链接多个字符串,字符串之间以指定的分隔符分开。
stringsubstr(string A, int start) substring(string A, int start)从文本字符串中指定的起始位置后的字符。
stringsubstr(string A, int start, int len) substring(string A, int start, int len)从文本字符串中指定的位置指定长度的字符
stringupper(string A) ucase(string A)将文本字符串转换成字母全部大写形式
stringlower(string A) lcase(string A)将文本字符串转换成字母全部小写形式
stringtrim(string A)删除字符串两端的空格,字符之间的空格保留
stringltrim(string A)删除字符串左边的空格,其他的空格保留
stringrtrim(string A)删除字符串右边的空格,其他的空格保留
stringregexp_replace(string A, string B, string C)字符串A中的B字符被C字符替代
stringregexp_extract(string subject, string pattern, int index)通过下标返回正则表达式指定的部分。regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) returns ‘bar.’
stringparse_url(string urlString, string partToExtract [, string keyToExtract])返回URL指定的部分。parse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1′, ‘HOST’) 返回:’facebook.com’
stringget_json_object(string json_string, string path)select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a;
stringspace(int n)返回指定数量的空格
stringrepeat(string str, int n)重复N次字符串
intascii(string str)返回字符串中首字符的数字值
stringlpad(string str, int len, string pad)返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从左侧填补。
stringrpad(string str, int len, string pad)返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从右侧填补。
arraysplit(string str, string pat)将字符串转换为数组。
intfind_in_set(string str, string strList)返回字符串str第一次在strlist出现的位置。如果任一参数为NULL,返回NULL;如果第一个参数包含逗号,返回0。
array<array<string>>sentences(string str, string lang, string locale)将字符串中内容按语句分组,每个单词间以逗号分隔,最后返回数组。 例如sentences(‘Hello there! How are you?’) 返回:( (“Hello”, “there”), (“How”, “are”, “you”) )
array<struct<string,double>>ngrams(array<array<string>>, int N, int K, int pf)SELECT ngrams(sentences(lower(tweet)), 2, 100 [, 1000]) FROM twitter;
array<struct<string,double>>context_ngrams(array<array<string>>, array<string>, int K, int pf)SELECT context_ngrams(sentences(lower(tweet)), array(null,null), 100, [, 1000]) FROM twitter;

3.内置的聚合函数(UDAF)

返回类型函数说明
bigintcount(*) , count(expr), count(DISTINCT expr[, expr_., expr_.])返回记录条数。
doublesum(col), sum(DISTINCT col)求和
doubleavg(col), avg(DISTINCT col)求平均值
doublemin(col)返回指定列中最小值
doublemax(col)返回指定列中最大值
doublevar_pop(col)返回指定列的方差
doublevar_samp(col)返回指定列的样本方差
doublestddev_pop(col)返回指定列的偏差
doublestddev_samp(col)返回指定列的样本偏差
doublecovar_pop(col1, col2)两列数值协方差
doublecovar_samp(col1, col2)两列数值样本协方差
doublecorr(col1, col2)返回两列数值的相关系数
doublepercentile(col, p)返回数值区域的百分比数值点。0<=P<=1,否则返回NULL,不支持浮点型数值。
array<double>percentile(col, array(p~1,\ [, p,2,]…))返回数值区域的一组百分比值分别对应的数值点。0<=P<=1,否则返回NULL,不支持浮点型数值。
doublepercentile_approx(col, p[, B])返回组中数字列(包括浮点类型)的近似p ^ th ^百分位数。B参数以内存为代价控制近似精度。 较高的值会产生更好的近似值,默认值为10,000。 当col中的不同值的数量小于B时,这给出了精确的百分位值。
array<double>percentile_approx(col, array(p~1, [, p,2_]…) [, B])与上面相同,但接受并返回百分位数值而不是单个值。
array<struct\{‘x’,'y’\}>histogram_numeric(col, b)使用b个非均匀间隔的箱计算组中数字列的直方图。 输出是一个大小为b的双值(x,y)坐标数组,表示bin中心和高度
arraycollect_set(col)返回无重复记录

4.内置表生成函数(UDTF)

a,b,c,d,e

返回类型函数说明
数组explode(array<T> a)数组一条记录中有多个参数,将参数拆分,每个参数生成一列。
json_tupleget_json_object 语句: select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a; json_tuple语句: select a.timestamp, b.* from log a lateral view json_tuple(a.appevent, ‘eventid’, ‘eventname’) b as f1, f2
hive的wordcount
create table tb_lines(line string) row format delimited lines terminated by ‘\n’; hello.txt select * from tb_lines limit 5; select split(line, " ") from tb_lines; select explode(split(line, " ")) from tb_lines limit 3; from (select explode(split(line, " ")) word from tb_lines) lines select word, count(word) group by lines.word; create table tb_count( word string, wordnum BIGINT ); from (select explode(split(line, " ")) word from tb_lines) lines insert into tb_count select word, count(word) cwd group by lines.word order by cwd desc; select * from tb_count limit 5;

5.自定义函数

自定义函数包括三种UDF、UDAF、UDTF

UDF(User-Defined-Function) 一进一出

UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。Count/max/min

UDTF(User-Defined Table-Generating Functions)&#160; 一进多出,如lateral view
explore()

使用方式 :在HIVE会话中add 自定义函数的jar文件,然后创建function继而使用函数

**
**

5.1 UDF 开发

1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。

2、编写UDF函数的时候需要注意一下几点:

a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。

b)需要实现evaluate函数,evaluate函数支持重载。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X3fAofSt-1618233378264)(media/0643ddd9e8fbd5483285c913313c683b.png)]

3、步骤

a)把程序打包放到目标机器上去;

b)进入hive客户端,添加jar包:hive>add jar /run/jar/udf_test.jar;

c)创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS ‘hive.udf.Add’;

d)查询HQL语句:

SELECT add_example(8, 9) FROM scores;

SELECT add_example(scores.math, scores.art) FROM scores;

SELECT add_example(6, 7, 8, 6.8) FROM scores;

e)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;

add jar /root/myhello.jar; create function hello as ‘com.bjsxt.hive.demo.MyHello’; select hello(name) from tb_user1; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fl7yBp1v-1618233379709)(media/b767e2a3202e84e40351b30e1b7d9be8.png)] drop function hello;
5.2 UDAF 自定义集函数

多行进一行出,如sum()、min(),用在group by时

1.必须继承

org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)

org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类Evaluator实现UDAFEvaluator接口)

2.Evaluator需要实现
init、iterate、terminatePartial、merge、terminate这几个函数

 init():类似于构造函数,用于UDAF的初始化

 iterate():接收传入的参数,并进行内部的轮转,返回boolean


terminatePartial():无参数,其为iterate函数轮转结束后,返回轮转数据,类似于hadoop的Combiner

 merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean

 terminate():返回最终的聚集函数结果

开发一个功能同:

Oracle的wm_concat()函数

Mysql的group_concat()

Hive UDF的数据类型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xm8Uve69-1618233378265)(media/caf52444476000b667229f3b68d996d9.png)]
句:

SELECT add_example(8, 9) FROM scores;

SELECT add_example(scores.math, scores.art) FROM scores;

SELECT add_example(6, 7, 8, 6.8) FROM scores;

e)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;

add jar /root/myhello.jar; create function hello as ‘com.bjsxt.hive.demo.MyHello’; select hello(name) from tb_user1; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VsVymehw-1618233379710)(media/b767e2a3202e84e40351b30e1b7d9be8.png)] drop function hello;
5.2 UDAF 自定义集函数

多行进一行出,如sum()、min(),用在group by时

1.必须继承

org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)

org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类Evaluator实现UDAFEvaluator接口)

2.Evaluator需要实现
init、iterate、terminatePartial、merge、terminate这几个函数

 init():类似于构造函数,用于UDAF的初始化

 iterate():接收传入的参数,并进行内部的轮转,返回boolean


terminatePartial():无参数,其为iterate函数轮转结束后,返回轮转数据,类似于hadoop的Combiner

 merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean

 terminate():返回最终的聚集函数结果

开发一个功能同:

Oracle的wm_concat()函数

Mysql的group_concat()

Hive UDF的数据类型:

[外链图片转存中…(img-Xm8Uve69-1618233378265)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值