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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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任务)。
编译器将一个Hive SQL转换操作符
操作符是Hive的最小的处理单元
每个操作符代表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中metastore的三种方式:
内嵌Derby方式
Local方式
Remote方式
这种方式是最简单的存储方式,只需要在hive-site.xml做如下配置便可
以下配置可写可不写,不写就是默认值 注意:ctrl-v+ctrl-a
|
---|
需要将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
这种存储方式需要本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下)。
hive-site.xml
|
---|
附:
安装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不一致
这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动metastore服务。
这里用node4节点上的mysql服务器,新建hive_remote数据库,字符集是UTF8
注:这里把hive的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,在启动的时候,需要先启动metastore服务
bin/hive --service metastore
bin/hive
./hive --help
将hive-site.xml配置文件拆为如下两部分
1)、服务端配置文件
2)、客户端配置文件
启动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不一致
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
VARCHAR (从Hve 0.12.0开始支持)
CHAR (从Hive 0.13.0开始支持)
BOOLEAN
BINARY (从Hive 0.8.0开始支持)
数组: ARRAY
allowed as of Hive 0.14.)
maps: MAP
expressions are allowed as of Hive 0.14.)
structs: STRUCT
union: UNIONTYPE
union支持不完整,略
(TINYINT, SMALLINT, INT/INTEGER, BIGINT)
整数类型默认是INT类型,除非数字超出了INT的范围,被解析为BIGINT类型。但是可以指定后缀:
类型 | 后缀 | 示例 |
---|---|---|
TINYINT | Y | 100Y |
SMALLINT | S | 100S |
BIGINT | L | 100L |
从Hive 2.2.0开始INTEGER作为INT的同义词。
是单引号或双引号引起来的字符序列。 “tom’s cat”
支持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-0101到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’); 少用 |
在Hive 0.13中用户可以指定位数和精度:DECIMAL(precision, scale).
如果小数位没有指定,默认为0,如果位数没有指定,则默认是10.
没有的值是NULL。
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
desc database extended
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; |
---|
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 |
hive> create table tb_user3 (id int, name string, age int, likes array |
hive> create table tb_user4 (id int, name string, age int, likes array |
hive> create table tb_user5 (id int, name string, age int, likes array |
hive> create table tb_user6 (id int, name string, age int, likes array |
存储格式 | 描述 |
---|---|
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中的表。 |
内部表和外部表
默认情况下,内部表存储于hive.metastore.warehouse.dir属性指定的路径下,即/user/hive/warehouse/databasename.db/tablename/目录。默认路径可以通过location属性在建表的时候指定。如果内部表或分区删除了,跟该表或分区关联的数据和元数据一并删除。如果没有指定PURGE选项,则数据会先移动到垃圾桶待指定的时间。
如果希望hive管理表的生命周期,或者是临时表,则使用内部表。
外部表在外部文件存储元数据以及表结构(mysql)。外部表文件可以被外部进程管理和访问。外部表可以访问存储于Azure
Storage
Volumes(ASV)或者远程HDFS上的数据。如果外部表的结构或者分区发生改变,则通过MSCK
REPAIR TABLE table_name语句修复和刷新元数据信息。
如果数据是已经存在或者存储与远程,或者当表删除后不希望删除数据,就可以使用外部表。
DESCRIBE [EXTENDED|FORMATTED] table_name
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 |
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) |
可以使用PARTITIONED
BY子句创建分区表。一个表可以有一个或多个分区列,对于分区列,每个不同的列值创建一个单独的数据目录。另外,表或者分区还可以使用CLUSTERED
BY子句分桶,还可以使用SORT
BY子句对桶内的数据进行排序。这样可以提高一些查询的性能。
如果在创建分区表的时候报错:“FAILED: Error in semantic analysis: Column repeated
in partitioning
columns”表示分区列已经在表字段中定义了。分区会创建可查询的伪列。如果伪列和表定义中的列名冲突,取不同的列名。
分区为了方便查询,加快查询
必须在表定义时指定对应的partition字段
a、单分区建表语句:
create table day_table (id int, content string) partitioned by (dt string);
单分区表,按天分区,在表结构中存在id,content,dt三列。
以dt为文件夹区分
b、 双分区建表语句:
create table day_hour_table (id int, content string) partitioned by (dt
string, hour string);
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
先以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 |
---|
hive> create table tb_user2 (id int, name string, likes array |
实际上只是创建文件夹,文件夹内没有数据文件
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 |
---|
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 |
---|
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表对应的位置。数据加载时在表下自动创建一个目录
SELECT day_table.* FROM day_table WHERE day_table.dt>= ‘2008-08-08’;
分区表的意义在于优化查询。查询时尽量利用分区字段。如果不使用分区字段,就会全部扫描。
SHOW PARTITIONS day_hour_table;
方案1、Msck repair table tablename
方案2、直接添加分区
加载文件中的数据到表:
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 - Serializer and Deserializer
SerDe 用于做序列化和反序列化。
构建在数据存储和执行引擎之间,对两者实现解耦。
Hive通过ROW FORMAT DELIMITED以及SERDE进行内容的读写。
[FIELDS TERMINATED BY char [ESCAPED BY char]]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
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;
Beeline 要与HiveServer2配合使用
服务端启动hiveserver2,服务端就是你启动metastore的节点
客户的通过beeline两种方式连接到hive
直接启动beeline连接指定的数据库
beeline -u jdbc:hive2://localhost:10000/default -n root
启动beeline之后再连接数据库
beeline
beeline> !connect jdbc:hive2://
root 123
默认 用户名、密码不验证
在beeline中使用!close关闭到hiveserver2的连接
在beeline中使用!quit退出beeline
服务端启动hiveserver2后,在java代码中通过调用hive的jdbc访问默认端口10000进行连接、访问
首先需要在java项目中添加hive的jar包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NitF8QMJ-1618233378262)(media/556c69f23de4bbe58434b847545c1872.png)]
运算符 | 类型 | 说明 |
---|---|---|
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相同。 |
运算符 | 类型 | 说明 |
---|---|---|
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 | 所有数字类型 | 对一个表达式执行按位”非”(取反)。 |
运算符 | 类型 | 说明 |
---|---|---|
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”相同 |
函数 | 类型 | 说明 |
---|---|---|
map | (key1, value1, key2, value2, …) | 通过指定的键/值对,创建一个map。 |
struct | (val1, val2, val3, …) | 通过指定的字段值,创建一个结构。结构字段名称将COL1,COL2,… |
array | (val1, val2, …) | 通过指定的元素,创建一个数组。 |
函数 | 类型 | 说明 |
---|---|---|
A[n] | A是一个数组,n为int型 | 返回数组A的第n个元素,第一个元素的索引为0。如果A数组为[‘foo’,‘bar’],则A[0]返回’foo’和A[1]返回”bar”。 |
M[key] | M是Map |
返回关键值对应的值,例如mapM为 \{‘f’ -> ‘foo’, ‘b’ -> ‘bar’, ‘all’ -> ‘foobar’\},则M[‘all’] 返回’foobar’。 |
S.x | S为struct | 返回结构x字符串在结构S中的存储位置。如 foobar \{int foo, int bar\} foobar.foo的领域中存储的整数。 |
返回类型 | 函数 | 说明 |
---|---|---|
BIGINT | round(double a) | 四舍五入 |
DOUBLE | round(double a,int d) | 小数部分d位之后数字四舍五入,例如round(21.263,2),返回21.26 |
BIGINT | floor(double a) | 对给定数据进行向下舍入最接近的整数。例如floor(21.2),返回21。 |
BIGINT | ceil(double a), ceiling(double a) | 将参数向上舍入为最接近的整数。例如ceil(21.2),返回23. |
double | rand(), rand(int seed) | 返回大于或等于0且小于1的平均分布随机数(依重新计算而变) |
double | exp(double a) | 返回e的n次方 |
double | ln(double a) | 返回给定数值的自然对数 |
double | log10(double a) | 返回给定数值的以10为底自然对数 |
double | log2(double a) | 返回给定数值的以2为底自然对数 |
double | log(double base, double a) | 返回给定底数及指数返回自然对数 |
double | pow(double a, double p) power(double a, double p) | 返回某数的乘幂 |
double | sqrt(double a) | 返回数值的平方根 |
string | bin(BIGINT a) | 返回二进制格式 |
string | hex(BIGINT a) hex(string a) | 将整数或字符转换为十六进制格式 |
string | unhex(string a) | 十六进制字符转换由数字表示的字符。 |
string | conv(BIGINT num, int from_base, int to_base) | 将指定数值由原来的度量体系转换为指定的度量体系。例如CONV(‘a’,16,2),返回。将16进制的a转换为2进制表示。 |
double | abs(double a) | 取绝对值 |
int double | pmod(int a, int b) pmod(double a, double b) | 返回a除b的余数的绝对值 |
double | sin(double a) | 返回给定角度的正弦值 |
double | asin(double a) | 返回x的反正弦,即是X。如果X是在-1到1的正弦值,返回NULL。 |
double | cos(double a) | 返回余弦 |
double | acos(double a) | 返回X的反余弦,即余弦是X,,如果-1<= A <= 1,否则返回null. |
int double | negative(int a) negative(double a) | 返回A的相反数,例如negative(2),返回-2。 |
返回类型 | 函数 | 说明 |
---|---|---|
int | size(Map |
返回map类型的元素数量 |
int | size(Array |
返回数组类型的元素数量 |
select size(likes), size(addrs) from tb_user1 where id=3; |
---|
返回类型 | 函数 | 说明 |
---|---|---|
指定 “type” | cast(expr as |
类型转换。例如将字符”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) |
---|
返回类型 | 函数 | 说明 |
---|---|---|
string | from_unixtime(bigint unixtime[, string format]) | UNIX_TIMESTAMP参数表示返回一个值’YYYY-MM–DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,这取决于是否是在一个字符串或数字语境中使用的功能。该值表示在当前的时区。 |
bigint | unix_timestamp() | 如果不带参数的调用,返回一个Unix时间戳(从’1970- 01 – 01 00:00:00′到现在的UTC秒数)为无符号整数。 |
bigint | unix_timestamp(string date) | 指定日期参数调用UNIX_TIMESTAMP(),它返回参数值’1970-01–01 00:00:00′到指定日期的秒数。 |
bigint | unix_timestamp(string date, string pattern) | 指定时间输入格式,返回到1970年秒数:unix_timestamp(’2009-03-20′, ‘yyyy-MM-dd’) = 1237532400 |
string | to_date(string timestamp) | 返回时间中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″ |
string | to_dates(string date) | 给定一个日期date,返回一个天数(0年以来的天数) |
int | year(string date) | 返回指定时间的年份,范围在1000到9999,或为”零”日期的0。 |
int | month(string date) | 返回指定时间的月份,范围为1至12月,或0一个月的一部分,如’0000-00-00′或’2008-00-00′的日期。 |
int | day(string date) dayofmonth(date) | 返回指定时间的日期 |
int | hour(string date) | 返回指定时间的小时,范围为0到23。 |
int | minute(string date) | 返回指定时间的分钟,范围为0到59。 |
int | second(string date) | 返回指定时间的秒,范围为0到59。 |
int | weekofyear(string date) | 返回指定日期所在一年中的星期号,范围为0到53。 |
int | datediff(string enddate, string startdate) | 两个时间参数的日期之差。 |
int | date_add(string startdate, int days) | 给定时间,在此基础上加上指定的时间段。 |
int | date_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) |
---|
返回类型 | 函数 | 说明 |
---|---|---|
T | if(boolean testCondition, T valueTrue, T valueFalseOrNull) | 判断是否满足条件,如果满足返回一个值,如果不满足则返回另一个值。 |
T | COALESCE(T v1, T v2, …) | 返回一组数据中,第一个不为NULL的值,如果均为NULL,返回NULL。 |
T | CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END | 当a=b时,返回c;当a=d时,返回e,否则返回f。 |
T | CASE 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; |
---|
返回类型 | 函数 | 说明 |
---|---|---|
int | length(string A) | 返回字符串的长度 |
string | reverse(string A) | 返回倒序字符串 |
string | concat(string A, string B…) | 连接多个字符串,合并为一个字符串,可以接受任意数量的输入字符串 |
string | concat_ws(string SEP, string A, string B…) | 链接多个字符串,字符串之间以指定的分隔符分开。 |
string | substr(string A, int start) substring(string A, int start) | 从文本字符串中指定的起始位置后的字符。 |
string | substr(string A, int start, int len) substring(string A, int start, int len) | 从文本字符串中指定的位置指定长度的字符 |
string | upper(string A) ucase(string A) | 将文本字符串转换成字母全部大写形式 |
string | lower(string A) lcase(string A) | 将文本字符串转换成字母全部小写形式 |
string | trim(string A) | 删除字符串两端的空格,字符之间的空格保留 |
string | ltrim(string A) | 删除字符串左边的空格,其他的空格保留 |
string | rtrim(string A) | 删除字符串右边的空格,其他的空格保留 |
string | regexp_replace(string A, string B, string C) | 字符串A中的B字符被C字符替代 |
string | regexp_extract(string subject, string pattern, int index) | 通过下标返回正则表达式指定的部分。regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) returns ‘bar.’ |
string | parse_url(string urlString, string partToExtract [, string keyToExtract]) | 返回URL指定的部分。parse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1′, ‘HOST’) 返回:’facebook.com’ |
string | get_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; |
string | space(int n) | 返回指定数量的空格 |
string | repeat(string str, int n) | 重复N次字符串 |
int | ascii(string str) | 返回字符串中首字符的数字值 |
string | lpad(string str, int len, string pad) | 返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从左侧填补。 |
string | rpad(string str, int len, string pad) | 返回指定长度的字符串,给定字符串长度小于指定长度时,由指定字符从右侧填补。 |
array | split(string str, string pat) | 将字符串转换为数组。 |
int | find_in_set(string str, string strList) | 返回字符串str第一次在strlist出现的位置。如果任一参数为NULL,返回NULL;如果第一个参数包含逗号,返回0。 |
array |
sentences(string str, string lang, string locale) | 将字符串中内容按语句分组,每个单词间以逗号分隔,最后返回数组。 例如sentences(‘Hello there! How are you?’) 返回:( (“Hello”, “there”), (“How”, “are”, “you”) ) |
array |
ngrams(array |
SELECT ngrams(sentences(lower(tweet)), 2, 100 [, 1000]) FROM twitter; |
array |
context_ngrams(array |
SELECT context_ngrams(sentences(lower(tweet)), array(null,null), 100, [, 1000]) FROM twitter; |
返回类型 | 函数 | 说明 |
---|---|---|
bigint | count(*) , count(expr), count(DISTINCT expr[, expr_., expr_.]) | 返回记录条数。 |
double | sum(col), sum(DISTINCT col) | 求和 |
double | avg(col), avg(DISTINCT col) | 求平均值 |
double | min(col) | 返回指定列中最小值 |
double | max(col) | 返回指定列中最大值 |
double | var_pop(col) | 返回指定列的方差 |
double | var_samp(col) | 返回指定列的样本方差 |
double | stddev_pop(col) | 返回指定列的偏差 |
double | stddev_samp(col) | 返回指定列的样本偏差 |
double | covar_pop(col1, col2) | 两列数值协方差 |
double | covar_samp(col1, col2) | 两列数值样本协方差 |
double | corr(col1, col2) | 返回两列数值的相关系数 |
double | percentile(col, p) | 返回数值区域的百分比数值点。0<=P<=1,否则返回NULL,不支持浮点型数值。 |
array |
percentile(col, array(p~1,\ [, p,2,]…)) | 返回数值区域的一组百分比值分别对应的数值点。0<=P<=1,否则返回NULL,不支持浮点型数值。 |
double | percentile_approx(col, p[, B]) | 返回组中数字列(包括浮点类型)的近似p ^ th ^百分位数。B参数以内存为代价控制近似精度。 较高的值会产生更好的近似值,默认值为10,000。 当col中的不同值的数量小于B时,这给出了精确的百分位值。 |
array |
percentile_approx(col, array(p~1, [, p,2_]…) [, B]) | 与上面相同,但接受并返回百分位数值而不是单个值。 |
array |
histogram_numeric(col, b) | 使用b个非均匀间隔的箱计算组中数字列的直方图。 输出是一个大小为b的双值(x,y)坐标数组,表示bin中心和高度 |
array | collect_set(col) | 返回无重复记录 |
a,b,c,d,e
返回类型 | 函数 | 说明 |
---|---|---|
数组 | explode(array |
数组一条记录中有多个参数,将参数拆分,每个参数生成一列。 |
json_tuple | get_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 |
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; |
---|
自定义函数包括三种UDF、UDAF、UDTF
UDF(User-Defined-Function) 一进一出
UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。Count/max/min
UDTF(User-Defined Table-Generating Functions) 一进多出,如lateral view
explore()
使用方式 :在HIVE会话中add 自定义函数的jar文件,然后创建function继而使用函数
**
**
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; |
---|
多行进一行出,如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()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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; |
---|
多行进一行出,如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()
[外链图片转存中…(img-Xm8Uve69-1618233378265)]