Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别

Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别

Pigphp

一种操做hadoop的轻量级脚本语言,最初又雅虎公司推出,不过如今正在走下坡路了。当初雅虎本身慢慢退出pig的维护以后将它开源贡献到开源社区由全部爱好者来维护。不过如今仍是有些公司在用,不过我认为与其使用pig不如使用hive。:)html

Pig是一种数据流语言,用来快速轻松的处理巨大的数据。java

Pig包含两个部分:Pig Interface,Pig Latin。node

Pig能够很是方便的处理HDFS和HBase的数据,和Hive同样,Pig能够很是高效的处理其须要作的,经过直接操做Pig查询能够节省大量的劳动和时间。当你想在你的数据上作一些转换,而且不想编写MapReduce jobs就能够用Pig.mysql

Hivelinux

不想用程序语言开发MapReduce的朋友好比DB们,熟悉SQL的朋友可使用Hive开离线的进行数据处理与分析工做。nginx

注意Hive如今适合在离线下进行数据的操做,就是说不适合在挂在真实的生产环境中进行实时的在线查询或操做,由于一个字“慢”。相反web

起源于FaceBook,Hive在Hadoop中扮演数据仓库的角色。创建在Hadoop集群的最顶层,对存储在Hadoop群上的数据提供类SQL的接口进行操做。你能够用 HiveQL进行select,join,等等操做。正则表达式

若是你有数据仓库的需求而且你擅长写SQL而且不想写MapReduce jobs就能够用Hive代替。算法

HBase

HBase做为面向列的数据库运行在HDFS之上,HDFS缺少随即读写操做,HBase正是为此而出现。HBase以Google BigTable为蓝本,以键值对的形式存储。项目的目标就是快速在主机内数十亿行数据中定位所需的数据并访问它。

HBase是一个数据库,一个NoSql的数据库,像其余数据库同样提供随即读写功能,Hadoop不能知足实时须要,HBase正能够知足。若是你须要实时访问一些数据,就把它存入HBase。

你能够用Hadoop做为静态数据仓库,HBase做为数据存储,放那些进行一些操做会改变的数据。

Pig VS Hive

Hive更适合于数据仓库的任务,Hive主要用于静态的结构以及须要常常分析的工做。Hive与SQL类似促使 其成为Hadoop与其余BI工具结合的理想交集。

Pig赋予开发人员在大数据集领域更多的灵活性,并容许开发简洁的脚本用于转换数据流以便嵌入到较大的 应用程序。

Pig相比Hive相对轻量,它主要的优点是相比于直接使用Hadoop Java APIs可大幅削减代码量。正由于如此,Pig仍然是吸引大量的软件开发人员。

Hive和Pig均可以与HBase组合使用,Hive和Pig还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的很是简单

Hive VS HBase

Hive是创建在Hadoop之上为了减小MapReduce jobs编写工做的批处理系统,HBase是为了支持弥补Hadoop对实时操做的缺陷的项目 。

想象你在操做RMDB数据库,若是是全表扫描,就用Hive+Hadoop,若是是索引访问,就用HBase+Hadoop 。

Hive query就是MapReduce jobs能够从5分钟到数小时不止,HBase是很是高效的,确定比Hive高效的多。

介绍:

1、什么是hive???

1,hive是基于Hadoop的一个数据仓库工具、

2,能够将结构化的数据文件映射为一张数据库表,并提供类sql的查询功能、

3,能够将sql语句转换为mapreduce任务进行运行、

4,能够用来进行数据提取转换加载(ETL)

5,hive是sql解析引擎,它将sql 语句转换成M/R job而后在Hadoop中运行。

hive的表其实就是HDFS的目录/文件夹。

hive表中的数据 就是hdfs目录中的文件。按表名把文件夹分开。若是是分区表,则分区值是子文件夹,能够直接在M/R job里使用这些数据.

6,hive优势与缺点:

能够提供类SQL语句快速实现简单的mapreduce统计,不须要开发专门的mapreduce应用

不支持实时查询

7,hive数据分为真实存储的数据和元数据

真实数据存储在hdfs中,元数据存储在mysql中

metastore 元数据存储数据库

 

Hive将元数据存储在数据库中,如MySQL、derby。

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

2、hive的体系架构:

用户接口,包括 CLI(shell),JDBC/ODBC,WebUI(经过浏览器)

元数据存储,一般是存储在关系数据库如 mysql, derby 中

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

Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算(带*的查询select * from teacher不会生成mapreduce任务,只是进行全表扫描)

 

在此强调:

Hadoop,zookpeer,spark,kafka,mysql已经正常启动

3、开始安装部署hive

基础依赖环境:

1,jdk 1.6+

2, hadoop 2.x

3,hive 0.13-0.19

4,mysql (mysql-connector-jar)

安装详细以下:

#java

export JAVA_HOME=/soft/jdk1.7.0_79/

export CLASSPATH=.:​JAVA_HOME/lib/tools.jar

#bin

export PATH=​JAVA_HOME/bin:​SCALA_HOME/bin:$SPARK_HOME/bin:/usr/local/hadoop/hive/bin

#hadoop

export HADOOP_HOME=/usr/local/hadoop/hadoop

#scala

export SCALA_HOME=/usr/local/hadoop/scala

#spark

export SPARK_HOME=/usr/local/hadoop/spark

#hive

export HIVE_HOME=/usr/local/hadoop/hive

1、开始安装:

1,下载:

https://hive.apache.org/downloads.html

解压:

tar xvf apache-hive-2.1.0-bin.tar.gz -C /usr/local/hadoop/

cd /usr/local/hadoop/

mv apache-hive-2.1.0 hive

2,修改配置

修改启动环境

cd /usr/local/hadoop/hive

vim bin/hive-config.sh

#java


export JAVA_HOME=/soft/jdk1.7.0_79/

#hadoop


export HADOOP_HOME=/usr/local/hadoop/hadoop

#hive


export HIVE_HOME=/usr/local/hadoop/hive

修改默认配置文件

cd /usr/local/hadoop/hive

vim conf/hive-site.xml


<configuration>

<property>

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

<value>jdbc:mysql://master:3306/hive?createDatabaseInfoNotExist=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>hive</value>

<description>Username to use against metastore database</description>

</property>

<property>

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

<value>xujun</value>

<description>password to use against metastore database</description>

</property>

</configuration>

3,修改tmp dir

修改将含有"system:java.io.tmpdir"的配置项的值修改成如上地址

/tmp/hive

4,安装mysql driver

去mysql官网下载驱动mysql-connector-java-5.1.40.zip

unzip mysql-connector-java-5.1.40.zip

cp mysql-connector-java-5.1.40-bin.jar /user/lcoal/hadoop/hive/lib/

 

2、安装好mysql,而且启动

1.建立数据库

create database hive

grant all on *.* to hive@'%' identified by 'hive';

flush privileges;

三,初始化hive(初始化metadata)

cd /usr/local/hadoop/hive

bin/schematool -initSchema -dbType mysql

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Metastore connection URL: jdbc:mysql://hadoop3:3306/hive?createDatabaseInfoNotExist=true

Metastore Connection Driver : com.mysql.jdbc.Driver

Metastore connection User: hive

Starting metastore schema initialization to 2.1.0

Initialization script hive-schema-2.1.0.mysql.sql

Initialization script completed

schemaTool completed

4、启动

[hadoop@hadoop1 hadoop]$** hive/bin/hive**

which: no hbase in (/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin://soft/jdk1.7.0_79//bin:/bin:/bin:/bin:/usr/local/hadoop/hive/bin:/home/hadoop/bin)

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/usr/local/hadoop/hive/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/usr/local/hadoop/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

Logging initialized using configuration in jar:file:/usr/local/hadoop/hive/lib/hive-common-2.1.0.jar!/hive-log4j2.properties Async: true

Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. tez, spark) or using Hive 1.X releases.

hive> show databases;

OK

default

Time taken: 1.184 seconds, Fetched: 1 row(s)

hive>

 

五,实践操做

 

 

使用hive建立表

如下两个操做只是针对当前session终端

1,hive> set hive.cli.print.current.db=true; 设置显示当前数据库名

hive (default)>

 

2,hive (default)> set hive.cli.print.header=true; 当使用select 查询数据时候,显示的结果会带有表的字段名称

 

3,建立表,并导入数据

hive> create table teacherq(id bigint,name string) row format delimited fields terminated by '\t';

OK

hive> create table people (id int ,name string);

OK

Time taken: 3.363 seconds

hive> SHOW TABLES;

OK

people

teacherq

student

Time taken: 0.283 seconds, Fetched: 1 row(s)

 

导入数据:

hive>l**oad data local inpath '/root/stdent.txt' into table teacherq;**

 

注意:若是你是普通用户启动hive,则使用相对路径来导入本地数据

 

mv stdent.txt /usr/local/hadoop/hive/

cd /usr/local/hadoop/hive

load data local inpath 'stdent.txt' into table teacherq;

Loading data to table default.teacherq

OK

Time taken: 2.631 seconds

hive> select * from teacherq;

OK

1 zhangsan

2 lisi

3 wangwu

4 libai

Time taken: 1.219 seconds, Fetched: 4 row(s)

hive>

4.建表(默认是内部表)

适用于先建立表,后load加载数据、

create table trade_detail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t';

默认普通表load数据:

load data local inpath '/root/student.txt' into table student;


建外部表 : 适用于,hdfs先有数据,后建立表,进行数据查询,分析管理

 

create external table td_ext(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t'** location **'/td_ext';

 

外部表load数据:

load data local inpath '/root/student.txt' into table student;

建分区表

方法一:先建立分区表,而后load数据

​ partition就是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照必定的规格和条件进行管理。

​ create table td_part(id bigint, account string, income double, expenses double, time string) partitioned by (logdate string) row format delimited fields terminated by '\t';

分区表中load数据

 

load data local inpath '/root/data.am' into table beauty partition (nation="USA");

hive (itcast)> select * from beat;

OK

beat.idbeat.namebeat.sizebeat.nation

1glm22.0china

2slsl21.0china

3sdsd20.0china

NULLwww19.0china

Time taken: 0.22 seconds, Fetched: 4 row(s)

方法二:先在hdfs 建立目录,倒入数据,最后,更改hive元数据的信息

1, 建立分区目录

hive (itcast)> dfs -mkdir /beat/nation=japan

dfs -ls /beat;

Found 2 items

drwxr-xr-x - hadoop supergroup 0 2016-12-05 16:07 /beat/nation=china

drwxr-xr-x - hadoop supergroup 0 2016-12-05 16:16 /beat/nation=japan

2, 为分区目录加载数据

hive (itcast)> dfs -put d.c /beat/nation=japan

​ 此时查询数据:数据还未加载进来。

hive (itcast)> dfs -ls /beat/nation=japan;

Found 1 items

-rw-r--r-- 3 hadoop supergroup 20 2016-12-05 16:16 /beat/nation=japan/d.c

hive (itcast)> select * from beat;

OK

beat.idbeat.namebeat.sizebeat.nation

1glm22.0china

2slsl21.0china

3sdsd20.0china

NULLwww19.0china

Time taken: 0.198 seconds, Fetched: 4 row(s)

3,手动修改hive表结构,添加分区表信息

hive (itcast)> alter table beat add partition (nation='japan') location "/beat/nation=japan";

OK

Time taken: 0.089 seconds

hive (itcast)> select * from beat;

OK

beat.idbeat.namebeat.sizebeat.nation

1glm22.0china

2slsl21.0china

3sdsd20.0china

NULLwww19.0china

7ab111.0japan

8rb23234.0japan

Time taken: 0.228 seconds, Fetched: 6 row(s)

此时数据加载完成。

删除分区

用户能够用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。

例:

ALTER TABLE beat DROP PARTITION (nation='japan');

特殊状况案例:

1,表中的某个字段须要做为分区的分区名,默认不容许建立,解决方法:

hive (itcast)> create table sms(id bigint ,content string,area string) partitioned by (area string) row format delimited fields terminated by '\t' ;

FAILED: SemanticException [Error 10035]: Column repeated in partitioning columns

解决方法:

创建冗余字段,即便用 area_pat来区分,

或者修改源码

hive (itcast)> create table sms(id bigint ,content string,area string) partitioned by (area_pat string) row format delimited fields terminated by '\t' ;

 

基本的配置包括环境变量加入到etc/profile文件中

export HIVE_HOME=/home/wangpeng/opt/hive

在将HIVE_HOME加载到PATH变量中去。

2.hive-site.xml这个文件中基本的url,driver,username,password配置号

3.驱动加载好

4.系统会报异常,若是是权限问题,该权限 :注意tmp系统和var系统是两个独立的文件系统,Hadoop会征用tmp系统,因此不要乱删东西(能够进入hadoop fs 修改权限)


Hadoop fs -chmod 777 /tmp/hive

5.还有一个是hive-site.xml中配置warehouse,日志,临时文件等路径

<property>

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

<value>/hive/warehouse</value>

<description>location of default database for the warehouse</description>

</property>

<property>

<name>hive.exec.scratchdir</name>

<value>/home/hadoop/soft/hive/hive/tmp/hive-${user.name}</value>

</property>

<!-- 如下写法在hdfs上生成 -->

<property>

<name>hive.querylog.location</name>

<value>/home/hadoop/soft/hive/hive/tmp/${user.name}</value>

</property>

</configuration>

6.hwi找不到包,找到解决方法,在制做的过程发现没有root制做不了。可能更linux版本有关。

去网上下载个源码

wangpeng@com:/opt/apache-hive-1.0.0-src/hwi/web$ jar -cvfM0 hive-hwi-1.0.0.war ./

-c 建立war包

-v 显示过程信息

-f 指定 JAR 文件名,一般这个参数是必须的

-M 不产生全部项的清单(MANIFEST〕文件,此参数会忽略 -m 参数

-0:是阿拉伯数字,表示不压缩

7.hive-site.xml关注下起配置文件读取是靠相对路径来找的,因此本身要注意配置相对路径。

<property>

<name>hive.hwi.war.file</name>

<value>lib/hive-hwi-1.0.0.war</value>

<description>This sets the path to the HWI war file, relative to ${HIVE_HOME}.

</description>

</property>

Hive简介

1.1 Hive定义

Hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

本质是将SQL转换为MapReduce程序。

 

1.2 为何使用Hive

一、面临的问题

​ 人员学习成本过高

​ 项目周期要求过短

​ 我只是须要一个简单的环境

MapReduce 如何搞定

复杂查询好难

​ Join如何实现

二、为何要使用Hive

操做接口采用类SQL语法,提供快速开发的能力

避免了去写MapReduce,减小开发人员的学习成本

扩展功能很方便

 

1.3 Hive特色

一、可扩展

Hive能够自由的扩展集群的规模,通常状况下不须要重启服务

二、延展性

Hive支持用户自定义函数,用户能够根据本身的需求来实现本身的函数

三、容错

良好的容错性,节点出现问题SQL仍可完成执行

 

1.4 Hive与Hadoop的关系

1.5 Hive与传统数据库的关系

1.6 Hive的历史

由FaceBook 实现并开源

2011年3月,0.7.0版本 发布,此版本为重大升级版本,增长了简单索引,HAING等众多高级特性

2011年06月,0.7.1 版本发布,修复了一些BUG,如在Windows上使用JDBC的的问题

2011年12月,0.8.0版本发布,此版本为重大升级版本,增长了insert into 、HA等众多高级特性

2012年2月5日,0.8.1版本发布,修复了一些BUG,如使 Hive 能够同时运行在 Hadoop0.20.x 与 0.23.0

2012年4月30日,0.9.0版本发布,重大改进版本,增长了对Hadoop 1.0.0的支持、实现BETWEEN等特性。

 

1.7 Hive的将来发展

增长更多相似传统数据库的功能,如存储过程

提升转换成的MapReduce性能

拥有真正的数据仓库的能力

UI部分增强

 

2 软件准备与环境规划

2.1 Hadoop环境介绍

Hadoop安装路径:/home/test/Desktop/hadoop-1.0.0/

Hadoop元数据存放目录:/home/test/data/core/namenode

Hadoop数据存放路径:/home/test/data/core/datanode

Hive安装路径:/home/test/Desktop/

Hive数据存放路径:/user/hive/warehouse

Hive元数据

第三方数据库:derby mysql

 

2.2 软件准备

OS

ubuntu

JDK

java 1.6.0_27

Hadoop

hadoop-1.0.0.tar

Hive

hive-0.8.1.tar

 

2.3 项目结构

2.4 Hive配置文件介绍

一、Hive配置文件介绍

hive-site.xml hive的配置文件

hive-env.sh hive的运行环境文件

hive-default.xml.template 默认模板

hive-env.sh.template hive-env.sh默认配置

hive-exec-log4j.properties.template exec默认配置

hive-log4j.properties.template log默认配置

二、hive-site.xml

< property>

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

<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>

<description>JDBC connectstring for a JDBC metastore</description>

</property>

<property>

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

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

<description>Driver classname for a JDBC metastore</description>

</property>

<property>

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

<value>root</value>

<description>username touse against metastore database</description>

</property>

<property>

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

<value>test</value>

<description>password touse against metastore database</description>

</property>

三、hive-env.sh

配置Hive的配置文件路径:export HIVE_CONF_DIR= your path

配置Hadoop的安装路径:HADOOP_HOME=your hadoop home

 

2.5 使用Derby数据库的安装方式

一、什么是Derby安装方式

ApacheDerby是一个彻底用java编写的数据库,因此能够跨平台,但须要在JVM中运行

Derby是一个Open source的产品,基于Apache License 2.0分发

即将元数据存储在Derby数据库中,也是Hive默认的安装方式。

 

二、安装Hive

解压Hive:tar zxvf hive-0.8.1.tar /home/test/Desktop

创建软链接:ln –s hive-0.8.1 hive

添加环境变量

export HIVE_HOME=/home/test/Desktop/hive

export PATH=….HIVE_HOME/bin:$PATH:.

 

三、配置Hive

进入hive/conf目录

依据hive-env.sh.template,建立hive-env.sh文件

cp hive-env.sh.template hive-env.sh

修改hive-env.sh

指定hive配置文件的路径

export HIVE_CONF_DIR=/home/test/Desktop/hive/conf

指定Hadoop路径

HADOOP_HOME=/home/test/Desktop/hadoop

四、hive-site.xml

<property>

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

<value>jdbc:derby:;databaseName=metastore_db;create=true</value>

<description>JDBCconnect string for a JDBC metastore</description>

</property>

 

<property>

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

<value>org.apache.derby.jdbc.EmbeddedDriver</value>

<description>Driver class name for a JDBC metastore</description>

</property>

<property>

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

<value>APP</value>

<description>username to use against metastoredatabase</description>

</property>

 

<property>

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

<value>mine</value>

<description>password to use against metastoredatabase</description>

</property>

 

五、启动hive

命令行键入

Hive

显示

WARNING: org.apache.hadoop.metrics.jvm.EventCounter is deprecated. Pleaseuse org.apache.hadoop.log.metrics.EventCounter in all the log4j.propertiesfiles.

Logging initialized using configuration injar:file:/home/test/Desktop/hive-0.8.1/lib/hive-common-0.8.1.jar!/hive-log4j.properties

Hive historyfile=/tmp/test/hive_job_log_test_201208260529_167273830.txt

hive>

 

五、测试语句

​ 创建测试表test

createtable test (key string);

showtables;

2.6 使用MySQL数据库的安装方式

一、安装MySQL

Ubuntu 采用apt-get安装

sudo apt-get install mysql-server

创建数据库hive

create database hive

建立hive用户,并受权

grant all on hive.* to hive@'%' identified by 'hive';

flush privileges;

 

二、安装Hive

解压Hive:

tar zxvf hive-0.8.1.tar /home/test/Desktop

创建软链接:

ln –s hive-0.8.1 hive

添加环境变量

exportHIVE_HOME=/home/test/Desktop/hive

exportPATH=….HIVE_HOME/bin:$PATH:.

三、修改hive-site.xml

<property>

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

<value>jdbc:mysql://localhost:3306/hive </value>

</property>

 

<property>

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

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

</property>

<property>

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

<value>hive </value>

</property>

 

<property>

<name>hive.hwi.listen.port </name>

<value>9999 </value>

<description>This is the port the Hive Web Interface will listenon </descript ion>

</property>

<property>

<name>datanucleus.autoCreateSchema </name>

<value>false </value>

</property>

 

<property>

<name>datanucleus.fixedDatastore </name>

<value>true </value>

</property>

<property>

<name>hive.metastore.local </name>

<value>true </value>

<description>controls whether toconnect to remove metastore server or open a new metastore server in HiveClient JVM </description>

</property>

四、启动Hive

命令行键入:Hive

显示

WARNING: org.apache.hadoop.metrics.jvm.EventCounter isdeprecated. Please use org.apache.hadoop.log.metrics.EventCounter in all thelog4j.properties files.

Logging initialized using configuration injar:file:/home/test/Desktop/hive-0.8.1/lib/hive-common-0.8.1.jar!/hive-log4j.properties

Hive historyfile=/tmp/test/hive_job_log_test_201208260529_167273830.txt

hive>

 

五、测试语句

创建测试表test

create table test (key string);

show tables;

 

3 Hive内建操做符与函数开发

3.1 关系运算符

等值比较: =

不等值比较: <>

小于比较: <

小于等于比较: <=

大于比较: >

大于等于比较: >=

空值判断: IS NULL

非空判断: IS NOT NULL

LIKE比较: LIKE

JAVA的LIKE操做: RLIKE

REGEXP操做: REGEXP

等值比较: =

语法:A=B

操做类型:全部基本类型

描述: 若是表达式A与表达式B相等,则为TRUE;不然为FALSE

举例:hive> select 1 from dual where 1=1;

 

不等值比较: <>

语法: A <> B

操做类型: 全部基本类型

描述: 若是表达式A为NULL,或者表达式B为NULL,返回NULL;若是表达式A与表达式B不相等,则为TRUE;不然为FALSE

举例:hive> select 1 from dual where 1 <> 2;

 

小于比较: <

语法: A < B

操做类型: 全部基本类型

描述: 若是表达式A为NULL,或者表达式B为NULL,返回NULL;若是表达式A小于表达式B,则为TRUE;不然为FALSE

举例:hive> select 1 from dual where 1 < 2;

 

小于等于比较: <=

语法: A <= B

操做类型: 全部基本类型

描述: 若是表达式A为NULL,或者表达式B为NULL,返回NULL;若是表达式A小于或者等于表达式B,则为TRUE;不然为FALSE

举例:hive> select 1 from dual where 1 <= 1;

 

大于等于比较: >=

语法: A >= B

操做类型: 全部基本类型

描述: 若是表达式A为NULL,或者表达式B为NULL,返回NULL;若是表达式A大于或者等于表达式B,则为TRUE;不然为FALSE

举例:hive> select 1 from dual where 1 >= 1;

 

空值判断: IS NULL

语法: A IS NULL

操做类型: 全部类型

描述: 若是表达式A的值为NULL,则为TRUE;不然为FALSE

举例:hive> select 1 from dual where null is null;

 

非空判断: IS NOT NULL

语法: A IS NOT NULL

操做类型: 全部类型

描述: 若是表达式A的值为NULL,则为FALSE;不然为TRUE

举例:hive> select 1 from dual where 1 is not null;

 

LIKE比较: LIKE

语法: A LIKE B

操做类型: strings

描述: 若是字符串A或者字符串B为NULL,则返回NULL;若是字符串A符合表达式B 的正则语法,则为TRUE;不然为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。

举例:hive> select 1 from dual where ‘key' like 'foot%';

hive> select 1 from dual where ‘key ' like'foot____';

注意:否认比较时候用 NOT A LIKE B

hive> select 1 from dual where NOT ‘key ' like 'fff%';

 

JAVA的LIKE操做: RLIKE

语法: A RLIKE B

操做类型: strings

描述: 若是字符串A或者字符串B为NULL,则返回NULL;若是字符串A符合JAVA正则表达式B的正则语法,则为TRUE;不然为FALSE。

举例:hive> select 1 from dual where 'footbar’ rlike'^f.*r$’;

注意:判断一个字符串是否全为数字:

hive>select 1 from dual where '123456' rlike '^\d+$';

hive> select 1 from dual where '123456aa' rlike'^\d+$';

 

REGEXP操做: REGEXP

语法: A REGEXP B

操做类型: strings

描述: 功能与RLIKE相同

举例:hive> select 1 from dual where ‘key' REGEXP'^f.*r$';

 

3.2 逻辑运算与数学运算

加法操做: +

减法操做: -

乘法操做: *

除法操做: /

取余操做: %

位与操做: &

位或操做: |

位异或操做: ^

位取反操做: ~

逻辑与操做: AND

逻辑或操做: OR

逻辑非操做: NOT

取整函数: round

指定精度取整函数: round

向下取整函数: floor

向上取整函数: ceil

向上取整函数: ceiling

取随机数函数: rand

天然指数函数: exp

以10为底对数函数: log10

以2为底对数函数: log2

对数函数: log

幂运算函数: pow

幂运算函数: power

开平方函数: sqrt

二进制函数: bin

十六进制函数: hex

反转十六进制函数: unhex

进制转换函数: conv

绝对值函数: abs

正取余函数: pmod

正弦函数: sin

反正弦函数: asin

余弦函数: cos

反余弦函数: acos

positive函数: positive

negative函数: negative

UNIX时间戳转日期函数: from_unixtime

获取当前UNIX时间戳函数: unix_timestamp

日期转UNIX时间戳函数: unix_timestamp

指定格式日期转UNIX时间戳函数: unix_timestamp

日期时间转日期函数: to_date

日期转年函数: year

日期转月函数: month

日期转天函数: day

日期转小时函数: hour

日期转分钟函数: minute

日期转秒函数: second

日期转周函数: weekofyear

日期比较函数: datediff

日期增长函数: date_add

日期减小函数: date_sub

If函数: if

非空查找函数: COALESCE

条件判断函数:CASE

字符串长度函数:length

字符串反转函数:reverse

字符串链接函数:concat

带分隔符字符串链接函数:concat_ws

字符串截取函数:substr,substring

字符串截取函数:substr,substring

字符串转大写函数:upper,ucase

字符串转小写函数:lower,lcase

去空格函数:trim

左边去空格函数:ltrim

右边去空格函数:rtrim

正则表达式替换函数:regexp_replace

正则表达式解析函数:regexp_extract

URL解析函数:parse_url

json解析函数:get_json_object

空格字符串函数:space

重复字符串函数:repeat

首字符ascii函数:ascii

左补足函数:lpad

右补足函数:rpad

分割字符串函数: split

集合查找函数: find_in_set

Map类型构建: map

Struct类型构建: struct

array类型构建: array

array类型访问: A[n]

map类型访问: M[key]

struct类型访问: S.x

Map类型长度函数: size(Map<K.V>)

array类型长度函数: size(Array<T>)

类型转换函数

 

一、加法操做: +

语法: A + B

操做类型:全部数值类型

说明:返回A与B相加的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。好比,int + int 通常结果为int类型,而int + double 通常结果为double类型

举例:hive> select 1 + 9 from dual; 10

 

二、减法操做: -

语法: A – B

操做类型:全部数值类型

说明:返回A与B相减的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。好比,int – int 通常结果为int类型,而int – double 通常结果为double类型

举例:hive> select 10 – 5 from dual;5

 

三、乘法操做 : *

语法: A * B

操做类型:全部数值类型

说明:返回A与B相乘的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。注意,若是A乘以B的结果超过默认结果类型的数值范围,则须要经过cast将结果转换成范围更大的数值类型

举例:hive> select 40 * 5 from dual;200

 

四、除法操做 : /

语法: A / B

操做类型:全部数值类型

说明:返回A除以B的结果。结果的数值类型为double

举例:hive> select 40 / 5 from dual;8.0

注意: hive 中最高精度的数据类型是 double, 只精确到小数点后 16 位,在作除法运算的时候要 特别注意:

hive>select ceil(28.0/6.99999999999999) from dual limit 1; 4

hive>select ceil(28.0/6.99999999999999) from dual limit 1; 5

 

五、取余操做 : %

语法: A % B

操做类型:全部数值类型

说明:返回A除以B的余数。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。

举例:hive> select 41 % 5 from dual; 1

hive> select 8.4 % 4 from dual; 0.40000000000000036

注意:精度在 hive 中是个很大的问题,相似这样的操做最好经过round 指定精度

hive> select round(8.4 % 4 , 2) from dual;0.4

 

六、位与操做 : &

语法: A & B

操做类型:全部数值类型

说明:返回A和B按位进行与操做的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。

举例:hive> select 4 & 8 from dual;0

hive> select 6 & 4 from dual;4

 

七、位或操做 : |

语法: A | B

操做类型:全部数值类型

说明:返回A和B按位进行或操做的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。

举例:hive> select 4 | 8 from dual; 12

hive> select 6 | 8 from dual; 14

 

八、位异或操做 : ^

语法: A ^ B

操做类型:全部数值类型

说明:返回A和B按位进行异或操做的结果。结果的数值类型等于A的类型和B的类型的最小父类型(详见数据类型的继承关系)。

举例:hive> select 4 ^ 8 from dual; 12

hive> select 6 ^ 4 from dual; 2

 

九、位取反操做 : ~

语法: ~A

操做类型:全部数值类型

说明:返回A按位取反操做的结果。结果的数值类型等于A的类型。

举例:hive> select ~6 from dual; -7

hive> select ~4 from dual; -5

 

十、逻辑与操做 : AND

语法: A AND B

操做类型:boolean

说明:若是A和B均为TRUE,则为TRUE;不然为FALSE。若是A为NULL或B为NULL,则为NULL

举例:hive> select 1 from dual where 1=1 and 2=2; 1

 

十一、逻辑或操做 : OR

语法: A OR B

操做类型:boolean

说明:若是A为TRUE,或者B为TRUE,或者A和B均为TRUE,则为TRUE;不然为FALSE

举例:hive> select 1 from dual where 1=2 or 2=2; 1

 

十二、逻辑非操做 : NOT

语法: NOT A

操做类型:boolean

说明:若是A为FALSE,或者A为NULL,则为TRUE;不然为FALSE

举例:hive> select 1 from dual where not 1=2;

 

1三、取整函数 : round

语法: round(double a)

返回值: BIGINT

说明: 返回double类型的整数值部分 (遵循四舍五入)

举例:hive> select round(3.1415926) from dual; 3

hive> select round(3.5) from dual; 4

hive> create table dual as select round(9542.158) fromdual;

hive> describe dual; _c0 bigint

 

1四、指定精度取整函数 : round

语法: round(double a, int d)

返回值: DOUBLE

说明: 返回指定精度d的double类型

举例: hive> selectround(3.1415926,4) from dual; 3.1416

 

1五、向下取整函数 : floor

语法: floor(double a)

返回值: BIGINT

说明: 返回等于或者小于该double变量的最大的整数

举例:hive> select floor(3.1415926) from dual; 3

hive> select floor(25) from dual; 25

 

1六、向上取整函数 : ceil

语法: ceil(double a)

返回值: BIGINT

说明: 返回等于或者大于该double变量的最小的整数

举例:hive> select ceil(3.1415926) from dual; 4

hive> select ceil(46) from dual; 46

 

1七、向上取整函数 : ceiling

语法: ceiling(double a)

返回值: BIGINT

说明: 与ceil功能相同

举例:hive> select ceiling(3.1415926) from dual; 4

hive> select ceiling(46) from dual; 46

 

1八、取随机数函数 : rand

语法: rand(),rand(int seed)

返回值: double

说明: 返回一个0到1范围内的随机数。若是指定种子seed,则会等到一个稳定的随机数序列

举例:hive> select rand() from dual; 0.5577432776034763

 

1九、天然指数函数 : exp

语法: exp(double a)

返回值: double

说明: 返回天然对数e的a次方

举例:hive> select exp(2) from dual; 7.38905609893065

 

20、天然对数函数: ln

语法: ln(double a)

返回值: double

说明: 返回a的天然对数

 

2一、以 10 为底对数函数 :log10

语法: log10(double a)

返回值: double

说明: 返回以10为底的a的对数

举例:hive> select log10(100) from dual;2.0

 

2二、以 2 为底对数函数 :log2

语法: log2(double a)

返回值: double

说明: 返回以2为底的a的对数

举例:hive> select log2(8) from dual; 3.0

 

2三、对数函数 : log

语法: log(double base, double a)

返回值: double

说明: 返回以base为底的a的对数

举例:hive> select log(4,256) from dual; 4.0

 

2四、幂运算函数 : pow

语法: pow(double a, double p)

返回值: double

说明: 返回a的p次幂

举例:hive> select pow(2,4) from dual; 16.0

 

2五、开平方函数 : sqrt

语法: sqrt(double a)

返回值: double

说明: 返回a的平方根

举例:hive> select sqrt(16) from dual; 4.0

 

2六、二进制函数 : bin

语法: bin(BIGINT a)

返回值: string

说明: 返回a的二进制代码表示

举例:hive> select bin(7) from dual; 111

 

2七、十六进制函数 : hex

语法: hex(BIGINT a)

返回值: string

说明: 若是变量是int类型,那么返回a的十六进制表示;若是变量是string类型,则返回该字符串的十六进制表示

举例:hive> select hex(17) from dual; 11

hive> select hex(‘abc’) from dual; 616263

 

2八、反转十六进制函数 : unhex

语法: unhex(string a)

返回值: string

说明: 返回该十六进制字符串所代码的字符串

举例: hive> selectunhex(‘616263’) from dual; abc

hive> select unhex(‘11’) from dual; -

hive> select unhex(616263) from dual; abc

 

2九、进制转换函数 : conv

语法: conv(BIGINT num, int from_base, int to_base)

返回值: string

说明: 将数值num从from_base进制转化到to_base进制

举例:hive> select conv(17,10,16) from dual; 11

hive> select conv(17,10,2) from dual; 10001

 

30、绝对值函数 : abs

语法: abs(double a) abs(int a)

返回值: double int

说明: 返回数值a的绝对值

举例:hive> select abs(-3.9) from dual; 3.9

hive> select abs(10.9) from dual; 10.9

 

3一、正取余函数 : pmod

语法: pmod(int a, int b),pmod(double a, double b)

返回值: int double

说明: 返回正的a除以b的余数

举例:hive> select pmod(9,4) from dual; 1

hive> select pmod(-9,4) from dual; 3

 

3二、正弦函数 : sin

语法: sin(double a)

返回值: double

说明: 返回a的正弦值

举例:hive> select sin(0.8) from dual; 0.7173560908995228

 

3三、反正弦函数 : asin

语法: asin(double a)

返回值: double

说明: 返回a的反正弦值

举例:hive> select asin(0.7173560908995228) from dual; 0.8

 

3四、余弦函数 : cos

语法: cos(double a)

返回值: double

说明: 返回a的余弦值

举例:hive> select cos(0.9) from dual; 0.6216099682706644

 

3五、反余弦函数 : acos

语法: acos(double a)

返回值: double

说明: 返回a的反余弦值

举例:hive> select acos(0.6216099682706644) from dual; 0.9

 

3六、positive 函数 : positive

语法: positive(int a), positive(double a)

返回值: int double

说明: 返回a

举例: hive> selectpositive(-10) from dual; -10

hive> select positive(12) from dual; 12

 

3七、negative 函数 : negative

语法: negative(int a), negative(double a)

返回值: int double

说明: 返回-a

举例:hive> select negative(-5) from dual; 5

hive> select negative(8) from dual; -8

 

3八、UNIX 时间戳转日期函数 : from_unixtime

语法: from_unixtime(bigint unixtime[, string format])

返回值: string

说明: 转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式

举例:hive> select from_unixtime(1323308943,'yyyyMMdd')from dual; 20111208

 

3九、获取当前 UNIX 时间戳函数 : unix_timestamp

语法: unix_timestamp()

返回值: bigint

说明: 得到当前时区的UNIX时间戳

举例:hive> select unix_timestamp() from dual; 1323309615

 

40、日期转 UNIX 时间戳函数 : unix_timestamp

语法: unix_timestamp(string date)

返回值: bigint

说明: 转换格式为"yyyy-MM-ddHH:mm:ss"的日期到UNIX时间戳。若是转化失败,则返回0。

举例:hive> select unix_timestamp('2011-12-07 13:01:03')from dual; 1323234063

 

4一、指定格式日期转 UNIX 时间戳函数 :unix_timestamp

语法: unix_timestamp(string date, string pattern)

返回值: bigint

说明: 转换pattern格式的日期到UNIX时间戳。若是转化失败,则返回0。

举例:hive> select unix_timestamp('2011120713:01:03','yyyyMMdd HH:mm:ss') from dual; 1323234063

 

4二、日期时间转日期函数 : to_date

语法: to_date(string timestamp)

返回值: string

说明: 返回日期时间字段中的日期部分。

举例:hive> select to_date('2011-12-08 10:03:01') fromdual;

 

4三、日期转年函数 : year

语法: year(string date)

返回值: int

说明: 返回日期中的年。

举例:hive> select year('2011-12-08 10:03:01') fromdual;2011

hive> select year('2012-12-08') from dual; 2012

 

4四、日期转月函数 : month

语法: month (string date)

返回值: int

说明: 返回日期中的月份。

举例:hive> select month('2011-12-08 10:03:01') fromdual;12

hive> select month('2011-08-08') from dual; 8

 

4五、日期转天函数 : day

语法: day (string date)

返回值: int

说明: 返回日期中的天。

举例:hive> select day('2011-12-08 10:03:01') from dual; 8

hive> select day('2011-12-24') from dual; 24

 

4六、日期转小时函数 : hour

语法: hour (string date)

返回值: int

说明: 返回日期中的小时。

举例:hive> select hour('2011-12-08 10:03:01') fromdual;10

 

4七、日期转分钟函数 : minute

语法: minute (string date)

返回值: int

说明: 返回日期中的分钟。

举例:hive> select minute('2011-12-08 10:03:01') fromdual; 3

 

4八、日期转秒函数 : second

语法: second (string date)

返回值: int

说明: 返回日期中的秒。

举例:hive> select second('2011-12-08 10:03:01') fromdual; 1

 

4九、日期转周函数 : weekofyear

语法: weekofyear (string date)

返回值: int

说明: 返回日期在当前的周数。

举例:hive> select weekofyear('2011-12-08 10:03:01') fromdual;49

 

50、日期比较函数 : datediff

语法: datediff(string enddate, string startdate)

返回值: int

说明: 返回结束日期减去开始日期的天数。

举例:hive> select datediff('2012-12-08','2012-05-09')from dual; 213

 

5一、日期增长函数 : date_add

语法: date_add(string startdate, int days)

返回值: string

说明: 返回开始日期startdate增长days天后的日期。

举例:hive> select date_add('2012-12-08',10) from dual;

 

5二、日期减小函数 : date_sub

语法: date_sub (string startdate, int days)

返回值: string

说明: 返回开始日期startdate减小days天后的日期。

举例:hive> select date_sub('2012-12-08',10) from dual;

 

5三、If 函数 : if

语法: if(boolean testCondition, T valueTrue, TvalueFalseOrNull)

返回值: T

说明: 当条件testCondition为TRUE时,返回valueTrue;不然返回valueFalseOrNull

举例:hive> select if(1=2,100,200) from dual; 200

hive> select if(1=1,100,200) from dual;100

 

5四、非空查找函数 : COALESCE

语法: COALESCE(T v1, T v2, …)

返回值: T

说明: 返回参数中的第一个非空值;若是全部值都为NULL,那么返回NULL

举例:hive> select COALESCE(null,'100','50′)from dual; 100

 

5五、条件判断函数: CASE

语法 : CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END

返回值 : T

说明:若是 a 等于 b ,那么返回 c ;若是 a 等于 d ,那么返回 e ;不然返回 f

举例:hive> Select case 100 when 50 then 'tom' when 100then 'mary' else 'tim' end from dual; mary

 

5六、字符串长度函数: length

语法: length(string A)

返回值: int

说明:返回字符串A的长度

举例:hive> select length('abcedfg') from dual; 7

 

5七、字符串反转函数: reverse

语法: reverse(string A)

返回值: string

说明:返回字符串A的反转结果

举例:hive> select reverse(abcedfg’) from dual; gfdecba

 

5八、字符串链接函数: concat

语法: concat(string A, string B…)

返回值: string

说明:返回输入字符串链接后的结果,支持任意个输入字符串

举例:hive> select concat(‘abc’,'def’,'gh’) from dual;

abcdefgh

 

5九、带分隔符字符串链接函数: concat_ws

语法: concat_ws(string SEP, string A, string B…)

返回值: string

说明:返回输入字符串链接后的结果,SEP表示各个字符串间的分隔符

举例:hive> select concat_ws(',','abc','def','gh') fromdual;

abc,def,gh

 

60、字符串截取函数: substr,substring

语法: substr(string A, int start),substring(string A, intstart)

返回值: string

说明:返回字符串A从start位置到结尾的字符串

举例:hive> select substr('abcde',3) from dual; cde

hive> select substring('abcde',3) from dual; cde

hive> selectsubstr('abcde',-1) from dual; e

 

6一、字符串截取函数: substr,substring

语法: substr(string A, int start, int len),substring(stringA, int start, int len)

返回值: string

说明:返回字符串A从start位置开始,长度为len的字符串

举例:hive> select substr('abcde',3,2) from dual; cd

hive> select substring('abcde',3,2) from dual; cd

hive>select substring('abcde',-2,2) from dual; de

 

6二、字符串转大写函数: upper,ucase

语法: upper(string A) ucase(string A)

返回值: string

说明:返回字符串A的大写格式

举例:hive> select upper('abSEd') from dual; ABSED

hive> select ucase('abSEd') from dual; ABSED

 

6三、字符串转小写函数: lower,lcase

语法: lower(string A) lcase(string A)

返回值: string

说明:返回字符串A的小写格式

举例:hive> select lower('abSEd') from dual; absed

hive> select lcase('abSEd') from dual; absed

 

6四、去空格函数: trim

语法: trim(string A)

返回值: string

说明:去除字符串两边的空格

举例:hive> select trim(' abc ') from dual; abc

 

6五、左边去空格函数: ltrim

语法: ltrim(string A)

返回值: string

说明:去除字符串左边的空格

举例:hive> select ltrim(' abc ') from dual; abc

 

6四、右边去空格函数: rtrim

语法: rtrim(string A)

返回值: string

说明:去除字符串右边的空格

举例:hive> select rtrim(' abc ') from dual; abc

 

6五、正则表达式替换函数: regexp_replace

语法: regexp_replace(string A, string B, string C)

返回值: string

说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些状况下要使用转义字符,相似oracle中的regexp_replace函数。

举例:hive> select regexp_replace('foobar', 'oo|ar', '')from dual; fb

 

6六、正则表达式解析函数: regexp_extract

语法: regexp_extract(string subject, string pattern, intindex)

返回值: string

说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

举例:hive> select regexp_extract('foothebar','foo(.*?)(bar)', 1) from dual; the

hive> select regexp_extract('foothebar','foo(.*?)(bar)', 2) from dual; bar

hive> select regexp_extract('foothebar','foo(.*?)(bar)', 0) from dual; foothebar

注意,在有些状况下要使用转义字符,下面的等号要用双竖线转 义,这是 java 正则表达式的规则。

select data_field,

regexp_extract(data_field,'.*?bgStart\=(&+)',1)as aaa,

regexp_extract(data_field,'.*?contentLoaded_headStart\=(&+)',1)as bbb,

regexp_extract(data_field,'.*?AppLoad2Req\=(&+)',1)as ccc

from pt_nginx_loginlog_st

where pt = '2012-03-26' limit 2;

 

6七、URL 解析函数: parse_url

语法: parse_url(string urlString, string partToExtract [,string keyToExtract])

返回值: string

说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.

举例:

hive>selectparse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') fromdual; facebook.com

hive> selectparse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY','k1') from dual; v1

 

6八、json 解析函数: get_json_object

语法: get_json_object(string json_string, string path)

返回值: string

说明:解析json的字符串json_string,返回path指定的内容。若是输入的json字符串无效,那么返回NULL。

举例:

hive> select get_json_object('{"store":

> {"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],

> "bicycle":{"price":19.95,"color":"red"}

> },

> "email":"amy@only_for_json_udf_test.net",

> "owner":"amy"

> }

> ','$.owner') from dual;

amy

 

6九、空格字符串函数: space

语法: space(int n)

返回值: string

说明:返回长度为n的字符串

举例:

hive> select space(10) from dual;

hive> select length(space(10)) from dual; 10

 

70、重复字符串函数: repeat

语法: repeat(string str, int n)

返回值: string

说明:返回重复n次后的str字符串

举例:hive> select repeat('abc',5) from dual;abcabcabcabcabc

 

7一、首字符 ascii 函数: ascii

语法: ascii(string str)

返回值: int

说明:返回字符串str第一个字符的ascii码

举例:hive> select ascii('abcde') from dual; 97

 

7二、左补足函数: lpad

语法: lpad(string str, int len, string pad)

返回值: string

说明:将str进行用pad进行左补足到len位

举例:hive> select lpad('abc',10,'td') from dual;tdtdtdtabc

注意:与 GP , ORACLE 不一样, pad 不能默认

 

7三、右补足函数: rpad

语法: rpad(string str, int len, string pad)

返回值: string

说明:将str进行用pad进行右补足到len位

举例:hive> select rpad('abc',10,'td') from dual;abctdtdtdt

 

7四、分割字符串函数 : split

语法: split(stringstr, string pat)

返回值: array

说明: 按照pat字符串分割str,会返回分割后的字符串数组

举例:

hive> select split('abtcdtef','t') from dual;

["ab","cd","ef"]

 

7五、集合查找函数 : find_in_set

语法: find_in_set(string str, string strList)

返回值: int

说明: 返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。若是没有找该str字符,则返回0

举例:hive> select find_in_set('ab','ef,ab,de') fromdual;2

hive> select find_in_set('at','ef,ab,de') from dual;0

 

7六、集合统计函数

语法: count(*), count(expr), count(DISTINCT expr[, expr_.])

返回值: int

说明: count(*)统计检索出的行的个数,包括NULL值的行;count(expr)返回指定字段的非空值的个数;count(DISTINCTexpr[, expr_.])返回指定字段的不一样的非空值的个数

举例:hive> select count(*) from dual; 20

hive> select count(distinct t) from dual; 10

 

7七、总和统计函数 : sum

语法: sum(col), sum(DISTINCT col)

返回值: double

说明: sum(col)统计结果集中col的相加的结果;sum(DISTINCT col)统计结果中col不一样值相加的结果

举例:hive> select sum(t) from dual; 100

hive> select sum(distinct t) from dual; 70

7八、平均值统计函数 : avg

语法: avg(col), avg(DISTINCT col)

返回值: double

说明: avg(col)统计结果集中col的平均值;avg(DISTINCT col)统计结果中col不一样值相加的平均值

举例:hive> select avg(t) from dual; 50

hive> select avg (distinct t) from dual; 30

 

7九、最小值统计函数 : min

语法: min(col)

返回值: double

说明: 统计结果集中col字段的最小值

举例:hive> select min(t) from dual; 20

 

80、最大值统计函数 : max

语法: maxcol)

返回值: double

说明: 统计结果集中col字段的最大值

举例:hive> select max(t) from dual; 120

 

8一、Map 类型构建 : map

语法: map (key1, value1, key2, value2, …)

说明:根据输入的key和value对构建map类型

举例:

hive> Create table alex_testas select map('100','tom','200','mary') as t from dual;

hive> describe alex_test;

t map<string,string>

hive> select t from alex_test;

{"100":"tom","200":"mary"}

 

8二、Struct 类型构建 : struct

语法: struct(val1, val2, val3, …)

说明:根据输入的参数构建结构体struct类型

举例:

hive> create table alex_test as selectstruct('tom','mary','tim') as t from dual;

hive> describe alex_test;

t structcol1:string,col2:string,col3:string

hive> select t from alex_test;

{"col1":"tom","col2":"mary","col3":"tim"}

 

8三、array 类型构建 : array

语法: array(val1, val2, …)

说明:根据输入的参数构建数组array类型

举例:

hive> create table alex_test as selectarray("tom","mary","tim") as t from dual;

hive> describe alex_test;

t array<string>

hive> select t from alex_test;

["tom","mary","tim"]

 

8四、array 类型访问 : A[n]

语法: A[n]

操做类型: A为array类型,n为int类型

说明:返回数组A中的第n个变量值。数组的起始下标为0。好比,A是个值为['foo','bar']的数组类型,那么A[0]将返回'foo',而A[1]将返回'bar'

举例:

hive> create table alex_test as selectarray("tom","mary","tim") as t from dual;

hive> select t[0],t[1],t[2] from alex_test; tom mary tim

 

8五、map 类型访问 : M[key]

语法: M[key]

操做类型: M为map类型,key为map中的key值

说明:返回map类型M中,key值为指定值的value值。好比,M是值为{'f' -> 'foo', 'b' -> 'bar', 'all' -> 'foobar'}的map类型,那么M['all']将会返回'foobar'

举例:

hive> Create table alex_test as selectmap('100','tom','200','mary') as t from dual;

hive> select t['200'],t['100'] from alex_test; mary tom

 

8六、struct 类型访问 : S.x

语法: S.x

操做类型: S为struct类型

说明:返回结构体S中的x字段。好比,对于结构体struct foobar {int foo, int bar},foobar.foo返回结构体中的foo字段

举例:

hive> create table alex_test as selectstruct('tom','mary','tim') as t from dual;

hive> describe alex_test;

t structcol1:string,col2:string,col3:string

hive> select t.col1,t.col3from alex_test;

tom tim

 

8七、Map 类型长度函数 :size(Map<K.V>)

语法: size(Map<K.V>)

返回值: int

说明: 返回map类型的长度

举例:hive> select size(map('100','tom','101','mary'))from dual; 2

 

8八、array 类型长度函数 :size(Array<T>)

语法: size(Array<T>)

返回值: int

说明: 返回array类型的长度

举例:hive> select size(array('100','101','102','103'))from dual; 4

 

8九、类型转换函数

类型转换函数: cast

语法: cast(expr as <type>)

返回值: Expected "=" to follow "type"

说明: 返回array类型的长度

举例:hive> select cast(1 as bigint) from dual; 1

 

4 Hive JDBC

4.1 基本操做对象的介绍

一、Connection

说明:与Hive链接的Connection对象

Hive的链接

jdbc:hive://IP:10000/default“

获取Connection的方法

DriverManager.getConnection("jdbc:hive://IP:10000/default","", "");

二、Statement

说明: 用于执行语句

建立方法

Statementstmt = con.createStatement();

主要方法

executeQuery

execute

三、ResultSet

说明:用来存储结果集

建立方法

1

stmt.executeQuery

主要方法

1

getString()

四、特殊类型的处理

Array

Map

Struct

 

4.2 datafile写操做

try {

Class.forName(driverName);

Connection con =DriverManager.getConnection("jdbc:hive://IP:10000/default","", "");

Statement stmt =con.createStatement();

String sql = "show tables";

// show tables

System.out.println("Running:" + sql);

ResultSet res =stmt.executeQuery(sql);

if (res.next()) {

System.out.println(res.getString(1));

}

4.3 基于Hive的数据库链接池

使用DataSource做为数据源的实现

DBConnectionManager采用单例模式

提供得到链接,关闭链接的方法

setupDataSource()

DBConnectionManagergetInstance()

close(Connectionconn)

synchronizedConnection getConnection()

5 Hive参数


hive.exec.max.created.files

说明:全部hive运行的map与reduce任务能够产生的文件的和

默认值:100000

 

hive.exec.dynamic.partition

说明:是否为自动分区

默认值:false

 

hive.mapred.reduce.tasks.speculative.execution

说明:是否打开推测执行

默认值:true

 

hive.input.format

说明:Hive默认的input format

默认值: org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

若是有问题可使用org.apache.hadoop.hive.ql.io.HiveInputFormat

 

hive.exec.counters.pull.interval

说明:Hive与JobTracker拉取counter信息的时间

默认值:1000ms

 

hive.script.recordreader

说明:使用脚本时默认的读取类

默认值: org.apache.hadoop.hive.ql.exec.TextRecordReader

 

hive.script.recordwriter

说明:使用脚本时默认的数据写入类

默认值: org.apache.hadoop.hive.ql.exec.TextRecordWriter

hive.mapjoin.check.memory.rows

说明: 内存里能够存储数据的行数

默认值: 100000

 

hive.mapjoin.smalltable.filesize

说明:输入小表的文件大小的阀值,若是小于该值,就采用普通的join

默认值: 25000000

 

hive.auto.convert.join

说明:是否是依据输入文件的大小,将Join转成普通的Map Join

默认值: false

 

hive.mapjoin.followby.gby.localtask.max.memory.usage

说明:map join作group by 操做时,可使用多大的内存来存储数据,若是数据太大,则不会保存在内存里

默认值:0.55

 

hive.mapjoin.localtask.max.memory.usage

说明:本地任务可使用内存的百分比

默认值: 0.90

 

hive.heartbeat.interval

说明:在进行MapJoin与过滤操做时,发送心跳的时间

默认值1000

 

hive.merge.size.per.task

说明: 合并后文件的大小

默认值: 256000000

hive.mergejob.maponly

说明: 在只有Map任务的时候 合并输出结果

默认值: true

 

hive.merge.mapredfiles

默认值: 在做业结束的时候是否合并小文件

说明: false

 

hive.merge.mapfiles

说明:Map-Only Job是否合并小文件

默认值:true

 

hive.hwi.listen.host

说明:Hive UI 默认的host

默认值:0.0.0.0

 

hive.hwi.listen.port

说明:Ui监听端口

默认值:9999

 

hive.exec.parallel.thread.number

说明:hive能够并行处理Job的线程数

默认值:8

 

hive.exec.parallel

说明:是否并行提交任务

默认值:false

 

hive.exec.compress.output

说明:输出使用压缩

默认值: false

hive.mapred.mode

说明: MapReduce的操做的限制模式,操做的运行在该模式下没有什么限制

默认值: nonstrict

hive.join.cache.size

说明: join操做时,能够存在内存里的条数

默认值: 25000

 

hive.mapjoin.cache.numrows

说明: mapjoin 存在内存里的数据量

默认值:25000

 

hive.join.emit.interval

说明: 有链接时Hive在输出前,缓存的时间

默认值: 1000

 

hive.optimize.groupby

说明:在作分组统计时,是否使用bucket table

默认值: true

 

hive.fileformat.check

说明:是否检测文件输入格式

默认值:true

 

hive.metastore.client.connect.retry.delay

说明: client 链接失败时,retry的时间间隔

默认值:1秒

 

hive.metastore.client.socket.timeout

说明: Client socket 的超时时间

默认值:20秒

mapred.reduce.tasks

默认值:-1

说明:每一个任务reduce的默认值

-1 表明自动根据做业的状况来设置reduce的值

 

hive.exec.reducers.bytes.per.reducer

默认值: 1000000000 (1G)

说明:每一个reduce的接受的数据量

​ 若是送到reduce的数据为10G,那么将生成10个reduce任务

 

hive.exec.reducers.max

默认值:999

说明: reduce的最大个数

 

hive.exec.reducers.max

默认值:999

说明: reduce的最大个数

 

hive.metastore.warehouse.dir

默认值:/user/hive/warehouse

说明: 默认的数据库存放位置

 

hive.default.fileformat

默认值:TextFile

说明: 默认的fileformat

 

hive.map.aggr

默认值:true

说明: Map端聚合,至关于combiner

 

hive.exec.max.dynamic.partitions.pernode

默认值:100

说明:每一个任务节点能够产生的最大的分区数

hive.exec.max.dynamic.partitions

默认值:1000

说明: 默认的能够建立的分区数

 

hive.metastore.server.max.threads

默认值:100000

说明: metastore默认的最大的处理线程数

 

hive.metastore.server.min.threads

默认值:200

说明: metastore默认的最小的处理线程数

6 Hive高级编程

6.1 产生背景

为了知足客户个性化的需求,Hive被设计成一个很开放的系统,不少内容都支持用户定制,包括:

文件格式:Text File,Sequence File

内存中的数据格式: Java Integer/String, Hadoop IntWritable/Text

用户提供的 map/reduce 脚本:无论什么语言,利用stdin/stdout 传输数据

一、用户自定义函数

虽然Hive提供了不少函数,可是有些仍是难以知足咱们的需求。所以Hive提供了自定义函数开发

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

UDF(User-Defined-Function)

UDAF(User- Defined Aggregation Funcation)

UDTF(User-DefinedTable-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求。

二、HIVE中使用定义的函数的三种方式

在HIVE会话中add 自定义函数的jar文件,而后建立function,继而使用函数

在进入HIVE会话以前先自动执行建立function,不用用户手工建立

把自定义的函数写到系统函数中,使之成为HIVE的一个默认函数,这样就不须要create temporary function。

6.2 UDF

UDF(User-Defined-Function):UDF函数能够直接应用于select语句,对查询结构作格式化处理后,再输出内容。

编写UDF函数的时候须要注意一下几点

A、自定义UDF须要继承org.apache.hadoop.hive.ql.UDF

B、须要实现evaluate函数

C、evaluate函数支持重载

D、UDF只能实现一进一出的操做,若是须要实现多进一出,则须要实现UDAF。

 

UDF用法代码示例

import org.apache.Hadoop.hive.ql.exec.UDF

public class Helloword extends UDF{

​ public Stringevaluate(){

​ return"hello world!";

​ }

 

​ public Stringevaluate(String str){

​ return"hello world: " + str;

​ }

}

 

开发步骤

开发代码

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

进入hive客户端

添加jar包:hive>add jar/run/jar/udf_test.jar;

建立临时函数:hive>CREATE TEMPORARY FUNCTION my_add AS'com.hive.udf.Add ‘

查询HQL语句:

SELECT my_add (8, 9) FROM scores;

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

销毁临时函数:hive> DROP TEMPORARY FUNCTION my_add ;

细节

在使用UDF的时候,会自动进行类型转换,例如:

SELECT my_add (8,9.1) FROM scores;

结果是17.1,UDF将类型为Int的参数转化成double。类型的饮食转换是经过UDFResolver来进行控制的

 

6.3 UDAF

UDAF

Hive查询数据时,有些聚类函数在HQL没有自带,须要用户自定义实现

用户自定义聚合函数: Sum, Average…… n –1

UDAF(User- Defined Aggregation Funcation)

用法

一下两个包是必须的import org.apache.hadoop.hive.ql.exec.UDAF和org.apache.hadoop.hive.ql.exec.UDAFEvaluator

 

开发步骤

函数类须要继承UDAF类,内部类Evaluator实UDAFEvaluator接口

Evaluator须要实现 init、iterate、terminatePartial、merge、terminate这几个函数

a)init函数实现接口UDAFEvaluator的init函数。

b)iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean。

c)terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial相似于hadoop的Combiner。

d)merge接收terminatePartial的返回结果,进行数据merge操做,其返回类型为boolean。

e)terminate返回最终的汇集函数结果。

执行步骤

执行求平均数函数的步骤

a)将java文件编译成Avg_test.jar。

b)进入hive客户端添加jar包:

hive>add jar /run/jar/Avg_test.jar。

c)建立临时函数:

hive>create temporary function avg_test 'hive.udaf.Avg';

d)查询语句:

hive>select avg_test(scores.math) from scores;

e)销毁临时函数:

hive>drop temporary function avg_test;

 

UDAF代码示例

public class MyAvg extends UDAF {

 

public static class AvgEvaluator implements UDAFEvaluator {

}

public void init() {}

public boolean iterate(Double o) {}

public AvgState terminatePartial() {}

public boolean terminatePartial(Double o) { }

public Double terminate() {}

 

}

 

6.4 UDTF

UDTF:UDTF(User-Defined Table-GeneratingFunctions) 用来解决 输入一行输出多行(On-to-many maping) 的需求。

开发步骤

必须继承org.apache.Hadoop.hive.ql.udf.generic.GenericUDTF

实现initialize, process, close三个方法

UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型),初始化完成后,会调用process方法,对传入的参数进行处理,能够经过forword()方法把结果返回.

最后close()方法调用,对须要清理的方法进行清理

 

使用方法

UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一块儿使用


直接select中使用:select explode_map(properties) as(col1,col2) from src;

不能够添加其余字段使用:select a, explode_map(properties) as (col1,col2) from src

不能够嵌套调用:select explode_map(explode_map(properties)) from src

不能够和group by/cluster by/distribute by/sort by一块儿使用:select explode_map(properties) as (col1,col2) from src group bycol1, col2

和lateral view一块儿使用:select src.id,mytable.col1, mytable.col2 from src lateral view explode_map(properties)mytable as col1, col2;

此方法更为方便平常使用。执行过程至关于单独执行了两次抽取,而后union到一个表里。

 

lateral view

语法:lateralView: LATERAL VIEW udtf(expression) tableAlias AScolumnAlias (',' columnAlias)* fromClause: FROM baseTable (lateralView)*

LateralView用于UDTF(user-defined table generating functions)中将行转成列,例如explode().

目前Lateral View不支持有上而下的优化。若是使用Where子句,查询可能将不被编译。

解决方法见:在查询以前执行set hive.optimize.ppd=false;

例子

pageAds。它有两个列

string pageid

Array<int> adid_list

" front_page"

[1, 2, 3]

"contact_page "

[ 3, 4, 5]

1

SELECT pageid, adid FROM pageAds LATERAL VIEWexplode(adid_list) adTable AS adid;

将输出以下结果

string pageid int adid

"front_page" 1

…….

“contact_page"3

 

代码示例

public class MyUDTF extends GenericUDTF{

public StructObjectInspector initialize(ObjectInspector[] args) {}

public void process(Object[] args) throws HiveException { }

}

 

7 HiveQL

7.1 DDL

一、DDL功能

建表

删除表

修改表结构

建立/删除视图

建立数据库

显示命令

增长分区、删除分区

重命名表

修改列的名字、类型、位置、注释

增长/更新列

增长表的元数据信息

 

二、建表

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_namedata_type [COMMENT col_comment], ...)]

[COMMENTtable_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]

[ROW FORMATrow_format]

[STORED ASfile_format]

[LOCATIONhdfs_path]

CREATE TABLE 建立一个指定名字的表。若是相同名字的表已经存在,则抛出异常;用户能够用 IF NOT EXIST 选项来忽略这个异常

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

LIKE 容许用户复制现有的表结构,可是不复制数据

COMMENT能够为表与字段增长描述

ROW FORMAT

DELIMITEDFIELDS TERMINATED BY char

MAP KEYSTERMINATED BY char

| SERDEserde_name [WITH SERDEPROPERTIES (property_name=property_value,property_name=property_value, ...)]

用户在建表的时候能够自定义 SerDe 或者使用自带的 SerDe。若是没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还须要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive 经过 SerDe 肯定表的具体的列的数据。

STORED AS

​ SEQUENCEFILE

​ |TEXTFILE

​ |RCFILE

​ |INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

若是文件数据是纯文本,可使用 STORED AS TEXTFILE。若是数据须要压缩,使用 STORED AS SEQUENCE 。

创建外部表

CREATE EXTERNAL TABLE page_view(viewTime INT, useridBIGINT,

​ page_urlSTRING, referrer_url STRING,

​ ip STRINGCOMMENT 'IP Address of the User',

​ country STRINGCOMMENT 'country of origination')

COMMENT 'This isthe staging page view table'

ROW FORMATDELIMITED FIELDS TERMINATED BY '\054'

STORED AS TEXTFILE

LOCATION'<hdfs_location>';

 

建分区表

CREATE TABLE par_table(viewTime INT, userid BIGINT,

​ page_urlSTRING, referrer_url STRING,

​ ip STRINGCOMMENT 'IP Address of the User')

COMMENT 'This isthe page view table'

PARTITIONEDBY(date STRING, pos STRING)

ROW FORMAT DELIMITED ‘\t’

FIELDSTERMINATED BY '\n'

STORED AS SEQUENCEFILE;

 

建Bucket表

CREATE TABLE par_table(viewTime INT, userid BIGINT,

​ page_urlSTRING, referrer_url STRING,

​ ip STRINGCOMMENT 'IP Address of the User')

COMMENT 'This isthe page view table'

PARTITIONEDBY(date STRING, pos STRING)

CLUSTEREDBY(userid) SORTED BY(viewTime) INTO 32 BUCKETS

ROW FORMAT DELIMITED‘\t’

FIELDSTERMINATED BY '\n'

STORED AS SEQUENCEFILE;

复制一个空表

CREATE TABLE empty_key_value_store LIKE key_value_store;

删除表

DROP TABLE table_name

增长、删除分区

增长

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

​ partition_spec:

: PARTITION(partition_col = partition_col_value, partition_col = partiton_col_value, ...)

删除

ALTER TABLE table_name DROP partition_spec,partition_spec,...

 

重命名表

ALTER TABLE table_name RENAME TO new_table_name

修改列的名字、类型、位置、注释

ALTER TABLE table_name CHANGE [COLUMN] col_old_namecol_new_name column_type COMMENT col_comment

这个命令能够容许改变列名、数据类型、注释、列位置或者它们的任意组合

 

增长/更新列

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_namedata_type [COMMENT col_comment], ...)

ADD是表明新增一字段,字段位置在全部列后面(partition列前)

​ REPLACE则是表示替换表中全部字段。

增长表的元数据信息

ALTER TABLE table_name SET TBLPROPERTIES table_propertiestable_properties:

​ :[property_name = property_value…..]

用户能够用这个命令向表中增长metadata

改变表文件格式与组织

ALTER TABLE table_name SET FILEFORMAT file_format;

ALTER TABLE table_name CLUSTERED BY(userid) SORTEDBY(viewTime) INTO num_buckets BUCKETS;

这个命令修改了表的物理存储属性

 

建立/删除视图

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

增长视图

若是没有提供表名,视图列的名字将由定义的SELECT表达式自动生成

若是修改基本表的属性,视图中不会体现,无效查询将会失败

视图是只读的,不能用LOAD/INSERT/ALTER

DROP VIEW view_name

 

删除视图

建立数据库

CREATE DATABASE name

显示命令

show tables;

show databases;

show partitions ;

show functions

describe extended table_name dot col_name

 

7.2 DML

一、DML功能

向数据表内加载文件

将查询结果插入到Hive表中

0.8新特性 insert into

二、向数据表内加载文件

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTOTABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

Load 操做只是单纯的复制/移动操做,将数据文件移动到 Hive 表对应的位置。

filepath

相对路径,例如:project/data1

绝对路径,例如: /user/hive/project/data1

包含模式的完整 URI,例如:

hdfs://namenode:9000/user/hive/project/data1

 

三、向数据表内加载文件

加载的目标能够是一个表或者分区。若是表包含分区,必须指定每个分区的分区名

filepath 能够引用一个文件(这种状况下,Hive 会将文件移动到表所对应的目录中)或者是一个目录(在这种状况下,Hive 会将目录中的全部文件移动至表所对应的目录中)

 

四、LOCAL关键字

指定了LOCAL

load 命令会去查找本地文件系统中的 filepath。若是发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也能够为本地文件指定一个完整的 URI,好比:file:///user/hive/project/data1.

load 命令会将 filepath 中的文件复制到目标文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置

没有指定LOCAL

​ 若是 filepath 指向的是一个完整的 URI,hive 会直接使用这个 URI。 不然

若是没有指定 schema 或者 authority,Hive 会使用在 hadoop 配置文件中定义的 schema 和 authority,fs.default.name指定了 Namenode 的 URI

若是路径不是绝对的,Hive 相对于 /user/ 进行解释。 Hive 会将 filepath 中指定的文件内容移动到 table (或者 partition)所指定的路径中

五、OVERWRITE

指定了OVERWRITE

目标表(或者分区)中的内容(若是有)会被删除,而后再将 filepath 指向的文件/目录中的内容添加到表/分区中。

若是目标表(分区)已经有一个文件,而且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。

 

六、将查询结果插入Hive表

将查询结果插入Hive表

将查询结果写入HDFS文件系统

基本模式

INSERT OVERWRITE TABLE tablename1 [PARTITION(partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

多插入模式

FROM from_statement

INSERT OVERWRITE TABLE tablename1 [PARTITION(partcol1=val1, partcol2=val2 ...)] select_statement1

[INSERT OVERWRITE TABLE tablename2 [PARTITION ...]select_statement2] ...

自动分区模式

INSERT OVERWRITETABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...)select_statement FROM from_statement

七、将查询结果写入HDFS文件系统

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ...FROM ...

​ FROMfrom_statement

​ INSERTOVERWRITE [LOCAL] DIRECTORY directory1 select_statement1

​ [INSERTOVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]

数据写入文件系统时进行文本序列化,且每列用^A 来区分,\n换行

八、INSERT INTO

INSERT INTO TABLEtablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1FROM from_statement

 

7.3 HiveQL 查询操做

一、SQL操做

基本的Select 操做

基于Partition的查询

Join

 

二、基本的Select 操做

SELECT [ALL | DISTINCT] select_expr, select_expr, ...

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list [HAVING condition]]

[ CLUSTER BYcol_list

| DISTRIBUTE BYcol_list

]

[LIMIT number]

使用ALL和DISTINCT选项区分对重复记录的处理。默认是ALL,表示查询全部记录。DISTINCT表示去掉重复的记录

Where 条件

相似咱们传统SQL的where 条件

目前支持 AND,OR ,0.9版本支持between

IN, NOT IN

不支持EXIST ,NOT EXIST

ORDER BY与SORT BY的不一样

ORDER BY 全局排序,只有一个Reduce任务

SORT BY 只在本机作排序

三、Limit

Limit 能够限制查询的记录数

SELECT * FROM t1 LIMIT 5

实现Top k 查询

下面的查询语句查询销售记录最大的 5 个销售表明。

SET mapred.reduce.tasks = 1

SELECT * FROMtest SORT BY amount DESC LIMIT 5

REGEX Column Specification

SELECT 语句可使用正则表达式作列选择,下面的语句查询除了 ds 和 hr 以外的全部列:

SELECT (ds|hr)?+.+ FROM test

基于Partition的查询

通常 SELECT 查询会扫描整个表,使用PARTITIONED BY 子句建表,查询就能够利用分区剪枝(input pruning)的特性

Hive 当前的实现是,只有分区断言出如今离 FROM 子句最近的那个WHERE 子句中,才会启用分区剪枝

四、Join

Syntax

join_table:

table_referenceJOIN table_factor [join_condition]

| table_reference{LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition

| table_referenceLEFT SEMI JOIN table_reference join_condition

 

table_reference:

​ table_factor

| join_table

 

table_factor:

​ tbl_name[alias]

| table_subqueryalias

| (table_references )

 

join_condition:

​ ONequality_expression ( AND equality_expression )*

 

equality_expression:

​ expression =expression

Hive 只支持等值链接(equality joins)、外链接(outer joins)和(left semi joins)。Hive 不支持全部非等值的链接,由于非等值链接很是难转化到 map/reduce 任务

 

LEFT,RIGHT和FULL OUTER关键字用于处理join中空记录的状况

LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现

join 时,每次 map/reduce 任务的逻辑是这样的:reducer 会缓存 join 序列中除了最后一个表的全部表的记录,再经过最后一个表将结果序列化到文件系统

实践中,应该把最大的那个表写在最后

五、join 查询时,须要注意几个关键点

只支持等值join

SELECT a.* FROM a JOIN b ON (a.id = b.id)

SELECT a.* FROM a JOIN b

​ ON (a.id = b.idAND a.department = b.department)

能够 join 多于 2 个表,例如:

SELECT a.val,b.val, c.val FROM a JOIN b

​ ON (a.key =b.key1) JOIN c ON (c.key = b.key2)

若是join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务

 

LEFT,RIGHT和FULL OUTER

例子:SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)

若是你想限制 join 的输出,应该在 WHERE 子句中写过滤条件——或是在 join 子句中写。

容易混淆的问题是表分区的状况

SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON(c.key=d.key)

WHEREa.ds='2010-07-07' AND b.ds='2010-07-07‘

若是 d 表中找不到对应 c 表的记录,d 表的全部列都会列出 NULL,包括ds 列。也就是说,join 会过滤 d 表中不能找到匹配 c 表 join key 的全部记录。这样的话,LEFT OUTER 就使得查询结果与 WHERE 子句无关

解决办法

SELECT c.val, d.val FROM c LEFT OUTER JOIN d

ON (c.key=d.keyAND d.ds='2009-07-07' AND c.ds='2009-07-07')

 

LEFT SEMI JOIN

LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其余地方过滤都不行。

SELECT a.key, a.value

FROM a

WHERE a.key in

(SELECT b.key

​ FROM B);

​ 能够被重写为:

​ SELECT a.key,a.val

FROM a LEFT SEMIJOIN b on (a.key = b.key)

 

UNION ALL

用来合并多个select的查询结果,须要保证select中字段须一致

select_statement UNION ALL select_statement UNION ALLselect_statement ...

 

7.4 从SQL到HiveQL应该转变的几个习惯

一、Hive不支持等值链接


SQL中对两表内联能够写成:

select * from dual a,dual b where a.key = b.key;

Hive中应为

select * from dual a join dual b on a.key = b.key;

 

二、分号字符

分号是SQL语句结束标记,在HiveQL中也是,可是在HiveQL中,对分号的识别没有那么智慧,例如:

select concat(key,concat(';',key)) from dual;

但HiveQL在解析语句时提示:

​ FAILED:Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in functionspecification

解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

select concat(key,concat('\073',key)) from dual;

 

三、IS [NOT]NULL

SQL中null表明空值, 值得警戒的是, 在HiveQL中String类型的字段如果空(empty)字符串, 即长度为0, 那么对它进行ISNULL的判断结果是False。

8 Hive Shell操做

8.1 Hive bin下脚本介绍

8.2 Hive Shell 基本操做

一、Hive 命令行

hive [-hiveconf x=y]* [<-ifilename>]* <-f filename>|<-e query-string>

-i 从文件初始化HQL

-e 从命令行执行指定的HQL

-f 执行HQL脚本

-v 输出执行的HQL语句到控制台

-p <port> connect to HiveServer on port number -hiveconf x=y Use this to set hive/hadoop configurationvariables.

Hive 命令行示例

从命令行执行指定的sql语句

$HIVE_HOME/bin/hive -e 'select a.colfrom tab1 a'

以指定的hive环境变量执行指定的sql语句

$HIVE_HOME/bin/hive -e 'select a.colfrom tab1 a' -hiveconf hive.exec.scratchdir=/home/my/hive_scratch -hiveconfmapred.reduce.tasks=32

以沉默模式执行指定的sql语句,并将执行结果导出到指定文件:

HIVE_HOME/bin/hive -e 'select a.col from tab1 a' > a.txt

以非交互式模式执行sql文件

HIVE_HOME/bin/hive -f /home/my/hive-script.sql

在进入交互模式以前,执行初始化sql文件

HIVE_HOME/bin/hive -i /home/my/hive-init.sql

 

Hive 交互式Shell命令

当命令 $HIVE_HOME/bin/hive以不带 -e/-f 选项的方式运行时, hive将进入到交互模式

以(;)冒号结束命令行

8.3 日志

Hive使用Log4J来处理日志

咱们能够经过下面的命令设计Hive的日志级别

$HIVE_HOME/bin/hive -hiveconfhive.root.logger=INFO,console

hive.root.logger的有INFO,DEBUG, 等

 

8.4 资源

Hive添加资源

Hive能够动态的添加资源,如文件

通常状况下,咱们是在与Hive进行交互时添加文件

其实是使用Hadoop的 Distributed Cache来控制的

 

例子

ADD { FILE[S] | JAR[S] | ARCHIVE[S]} <filepath1> [<filepath2>]*

LIST { FILE[S] | JAR[S] | ARCHIVE[S]} [<filepath1> <filepath2> ..]

DELETE { FILE[S] | JAR[S] |ARCHIVE[S] } [<filepath1> <filepath2> ..]

9 Hive优化

9.1 Hadoop 计算框架的特性

一、什么是数据倾斜

因为数据的不均衡缘由,致使数据分布不均匀,形成数据大量的集中到一点,形成数据热点。

 

二、Hadoop框架的特性

不怕数据大,怕数据倾斜

jobs数比较多的做业运行效率相对比较低,好比即便有几百行的表,若是屡次关联屡次汇总,产生十几个jobs,耗时很长。缘由是map reduce做业初始化的时间是比较长的

sum,count,max,min等UDAF,不怕数据倾斜问题,hadoop在map端的汇总合并优化,使数据倾斜不成问题

count(distinct ),在数据量大的状况下,效率较低,由于count(distinct)是按group by 字段分组,按distinct字段排序,通常这种分布方式是很倾斜的。

 

9.2 优化的经常使用手段

解决数据倾斜问题

减小job数

设置合理的map reduce的task数,能有效提高性能。

了解数据分布,本身动手解决数据倾斜问题是个不错的选择

数据量较大的状况下,慎用count(distinct)。

对小文件进行合并,是行至有效的提升调度效率的方法。

优化时把握总体,单个做业最优不如总体最优。

9.3 Hive的数据类型方面的优化--优化原则

按照必定规则分区(例如根据日期)。经过分区,查询的时候指定分区,会大大减小在无用数据上的扫描, 同时也很是方便数据清理。

合理的设置Buckets。在一些大数据join的状况下,map join有时候会内存不够。若是使用Bucket Map Join的话,能够只把其中的一个bucket放到内存中,内存中原来放不下的内存表就变得能够放下。这须要使用buckets的键进行join的条件连结,而且须要以下设置

1

set hive.optimize.bucketmapjoin = true

9.4 Hive的操做方面的优化

全排序

怎样作笛卡尔积

怎样决定map个数

怎样决定reducer个数

合并MapReduce操做

Bucket 与sampling

Partition

JOIN

Group By

合并小文件

一、全排序

Hive的排序关键字是SORTBY,它有意区别于传统数据库的ORDER BY也是为了强调二者的区别–SORT BY只能在单机范围内排序。

 

二、怎样作笛卡尔积

当Hive设定为严格模式(hive.mapred.mode=strict)时,不容许在HQL语句中出现笛卡尔积

MapJoin是的解决办法

MapJoin,顾名思义,会在Map端完成Join操做。这须要将Join操做的一个或多个表彻底读入内存

MapJoin的用法是在查询/子查询的SELECT关键字后面添加/*+MAPJOIN(tablelist) */提示优化器转化为MapJoin(目前Hive的优化器不能自动优化MapJoin)

其中tablelist能够是一个表,或以逗号链接的表的列表。tablelist中的表将会读入内存,应该将小表写在这里

在大表和小表作笛卡尔积时,规避笛卡尔积的方法是,给Join添加一个Join key,原理很简单:将小表扩充一列join key,并将小表的条目复制数倍,join key各不相同;将大表扩充一列join key为随机数

 

三、控制Hive的Map数

一般状况下,做业会经过input的目录产生一个或者多个map任务

主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中经过setdfs.block.size;命令查看到,该参数不能自定义修改)

是否是map数越多越好

答案是否认的。若是一个任务有不少小文件(远远小于块大小128m),则每一个小文件也会被当作一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会形成很大的资源浪费。并且,同时可执行的map数是受限的

是否是保证每一个map处理接近128m的文件块,就高枕无忧了?

​ 答案也是不必定。好比有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,

若是map处理的逻辑比较复杂,用一个map任务去作,确定也比较耗时。

针对上面的问题3和4,咱们须要采起两种方式来解决:即减小map数和增长map数;

是否是保证每一个map处理接近128m的文件块,就高枕无忧了?

​ 答案也是不必定。好比有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,

若是map处理的逻辑比较复杂,用一个map任务去作,确定也比较耗时。

针对上面的问题3和4,咱们须要采起两种方式来解决:即减小map数和增长map数;

举例

​ a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数

​ b) 假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数

即,若是文件大于块大小(128m),那么会拆分,若是小于块大小,则把该文件当成一个块

四、怎样决定reducer个数

Hadoop MapReduce程序中,reducer个数的设定极大影响执行效率

不指定reducer个数的状况下,Hive会猜想肯定一个reducer个数,基于如下两个设定:

​ 参数1:hive.exec.reducers.bytes.per.reducer(默认为1G)

​ 参数2 :hive.exec.reducers.max(默认为999)

计算reducer数的公式

N=min(参数2,总输入数据量/参数1)

依据Hadoop的经验,能够将参数2设定为0.95*(集群中TaskTracker个数)

reduce个数并非越多越好

同map同样,启动和初始化reduce也会消耗时间和资源;

另外,有多少个reduce,就会有多少个输出文件,若是生成了不少个小文件,那么若是这些小文件做为下一个任务的输入,则也会出现小文件过多的问题

什么状况下只有一个reduce

​ 不少时候你会发现任务中无论数据量多大,无论你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务;

其实只有一个reduce任务的状况,除了数据量小于

​ hive.exec.reducers.bytes.per.reducer参数值的状况外,还有如下缘由:

​ a) 没有group by的汇总

​ b) 用了Order by

五、合并 MapReduce操做

Multi-group by

Multi-group by是Hive的一个很是好的特性,它使得Hive中利用中间结果变得很是方便

FROM log

insert overwrite table test1 select log.id group by log.id

insert overwrite table test2select log.name group by log.name

上述查询语句使用了Multi-group by特性连续group by了2次数据,使用不一样的groupby key。这一特性能够减小一次MapReduce操做。

 

六、Bucket 与 Sampling

Bucket是指将数据以指定列的值为key进行hash,hash到指定数目的桶中。这样就能够支持高效采样了

Sampling能够在全体数据上进行采样,这样效率天然就低,它仍是要去访问全部数据。而若是一个表已经对某一列制做了bucket,就能够采样全部桶中指定序号的某个桶,这就减小了访问量。

以下例所示就是采样了test中32个桶中的第三个桶。

SELECT * FROM test 、、、TABLESAMPLE(BUCKET 3 OUT OF 32);

 

七、JOIN 原则

在使用写有 Join 操做的查询语句时有一条原则:应该将条目少的表/子查询放在 Join 操做符的左边

缘由是在 Join 操做的 Reduce 阶段,位于 Join 操做符左边的表的内容会被加载进内存,将条目少的表放在左边,能够有效减小发生 OOM 错误的概率。

八、Map Join

Join 操做在 Map阶段完成,再也不须要Reduce,前提条件是须要的数据在 Map的过程当中能够访问到

例如:

INSERT OVERWRITE TABLE phone_traffic

SELECT /*+MAPJOIN(phone_location) */ l.phone,p.location,l.traffic from phone_location p join log l on(p.phone=l.phone)

相关的参数为:

hive.join.emit.interval = 1000How many rows in the right-most join operand Hive should buffer before emittingthe join result.

hive.mapjoin.size.key = 10000

hive.mapjoin.cache.numrows =10000

 

九、Group By

Map 端部分聚合

并非全部的聚合操做都须要在 Reduce 端完成,不少聚合操做均可以先在 Map 端进行部分聚合,最后在 Reduce 端得出最终结果

 

基于 Hash

参数包括:

hive.map.aggr = true 是否在 Map 端进行聚合,默认为 True

hive.groupby.mapaggr.checkinterval =100000 在 Map 端进行聚合操做的条目数目

有数据倾斜的时候进行负载均衡

hive.groupby.skewindata = false

当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每一个 Reduce 作部分聚合操做,并输出结果,这样处理的结果是相同的 Group ByKey 有可能被分发到不一样的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程能够保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操做。

 

十、合并小文件

文件数目过多,会给 HDFS 带来压力,而且会影响处理效率,能够经过合并 Map 和 Reduce 的结果文件来消除这样的影响:

hive.merge.mapfiles = true 是否和并 Map 输出文件,默认为 True

hive.merge.mapredfiles = false 是否合并 Reduce 输出文件,默认为 False

hive.merge.size.per.task =25610001000 合并文件的大小

10 Hive体系架构

10.1 概念

用户接口:用户访问Hive的入口

元数据:Hive的用户信息与表的MetaData

解释器:分析翻译HQL的组件

编译器:编译HQL的组件

优化器:优化HQL的组件

10.2 Hive架构与基本组成

一、架构图

二、基本组成

用户接口,包括 CLI,JDBC/ODBC,WebUI

元数据存储,一般是存储在关系数据库如 mysql, derby 中

解释器、编译器、优化器、执行器

Hadoop:用HDFS 进行存储,利用 MapReduce 进行计算

三、各组件的基本功能

用户接口主要有三个:CLI,JDBC/ODBC和 WebUI

CLI,即Shell命令行

JDBC/ODBC 是Hive 的JAVA,与使用传统数据库JDBC的方式相似

WebGUI是经过浏览器访问 Hive

Hive 将元数据存储在数据库中,目前只支持 mysql、derby,下一版本会支持更多的数据库。

Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等

解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。

生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行

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

四、Metastore

Metastore是系统目录(catalog)用于保存Hive中所存储的表的元数据(metadata)信息

Metastore是Hive被用做传统数据库解决方案(如oracle和db2)时区别其它相似系统的一个特征

Metastore包含以下的部分:

Database 是表(table)的名字空间。默认的数据库(database)名为‘default’

Table 表(table)的原数据包含信息有:列(list of columns)和它们的类型(types),拥有者(owner),存储空间(storage)和SerDei信息

Partition 每一个分区(partition)都有本身的列(columns),SerDe和存储空间(storage)。这一特征将被用来支持Hive中的模式演变(schema evolution)

 

五、Compiler

Driver调用编译器(compiler)处理HiveQL字串,这些字串多是一条DDL、DML或查询语句

编译器将字符串转化为策略(plan)

策略仅由元数据操做和HDFS操做组成,元数据操做只包含DDL语句,HDFS操做只包含LOAD语句

对插入和查询而言,策略由map-reduce任务中的具备方向的非循环图(directedacyclic graph,DAG)组成

10.3 Hive运行模式

Hive的运行模式即任务的执行环境 分为 本地 与 集群两种

咱们能够经过mapred.job.tracker 来指明

设置方式:hive > SET mapred.job.tracker=local

 

10.4 数据类型

一、原始数据类型

Integers:TINYINT - 1 byte、SMALLINT - 2 byte、INT - 4 byte、BIGINT - 8 byte

Boolean type:BOOLEAN - TRUE/FALSE

Floating point numbers:FLOAT –单精度、DOUBLE – 双精度

String type:STRING - sequence of charactersin a specified character set

 

二、复杂数据类型

Structs: 例子 {c INT; d INT}

Maps (key-value tuples):. 例子'group' ->gid M['group']

Arrays (indexable lists): 例子[‘1', ‘2', ‘3']

TIMESTAMP 0.8版本新加属性

10.5 Hive的元数据存储

一、存储方式与模式

Hive将元数据存储在数据库中

链接到数据库模式有三种

单用户模式

多用户模式

远程服务器模式

 

二、单用户模式

此模式链接到一个 In-memory 的数据库 Derby ,通常用于 Unit Test

10.6 Hive的数据存储

一、Hive数据存储的基本概念

Hive的数据存储是创建在Hadoop HDFS之上的

Hive没有专门的数据存储格式

存储结构主要包括:数据库、文件、表、视图

Hive默承认以直接加载文本文件,还支持sequence file 、RCFile

建立表时,咱们直接告诉Hive数据的列分隔符与行分隔符,Hive便可解析数据

 

二、Hive的数据模型-数据库

相似传统数据库的DataBase

在第三方数据库里实际是一张表

简单示例:命令行hive > create database test_database;

 

三、内部表

与数据库中的 Table 在概念上是相似

每个 Table 在 Hive 中都有一个相应的目录存储数据

例如,一个表 test,它在 HDFS 中的路径为:/warehouse /test

warehouse是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir}指定的数据仓库的目录

全部的 Table 数据(不包括 External Table)都保存在这个目录中。

删除表时,元数据与数据都会被删除

四、内部表简单示例

建立数据文件test_inner_table.txt

建立表

create table test_inner_table (key string)

加载数据

LOAD DATA LOCAL INPATH ‘filepath’ INTO TABLE test_inner_table

查看数据

select * from test_inner_table

select count(*) from test_inner_table

删除表

drop table test_inner_table

 

五、分区表

Partition 对应于数据库中的 Partition 列的密集索引

在 Hive 中,表中的一个 Partition 对应于表下的一个目录,全部的 Partition 的数据都存储在对应的目录中


例如:test表中包含 date 和position 两个 Partition,则对应于 date= 20120801, position = zh 的 HDFS 子目录为:/ warehouse /test/date=20120801/ position =zh

对应于 = 20100801, position = US 的HDFS 子目录为;/ warehouse/xiaojun/date=20120801/ position =US

六、分区表简单示例

建立数据文件test_partition_table.txt

建立表

create table test_partition_table (key string) partitioned by (dtstring)

加载数据

LOAD DATA INPATH ‘filepath’ INTO TABLE test_partition_tablepartition (dt=‘2006’)

查看数据

select * from test_partition_table

select count(*) from test_partition_table

删除表

drop table test_partition_table

 

七、外部表

指向已经在 HDFS 中存在的数据,能够建立 Partition

它和 内部表 在元数据的组织上是相同的,而实际数据的存储则有较大的差别

内部表 ** 的建立过程和数据加载过程(这两个过程能够在同一个语句中完成),在加载数据的过程当中,实**


际数据会被移动到数据仓库目录中;以后对数据对访问将会直接在数据仓库目录中完成。删除表时,表


中的数据和元数据将会被同时删除



外部表 **只有一个过程,加载数据和建立表同时完成,并不会移动到数据仓库目录中,只是与外部数据**


建**立一个连接。当删除一个外部表 时,仅删除该连接**

八、外部表简单示例

建立数据文件test_external_table.txt

建立表

create external table test_external_table (key string)

加载数据

LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table

查看数据

select * from test_external_table

select count(*) from test_external_table

删除表

drop table test_external_table

 

九、Bucket Table(桶表)

能够将表的列经过Hash算法进一步分解成不一样的文件存储

例如:将age列分散成20个文件,首先要对AGE进行Hash计算,对应为0的写入/warehouse/test/date=20120801/postion=zh/part-00000,对应为1的写入/warehouse/test/date=20120801/postion=zh/part-00001

若是想应用不少的Map任务这样是不错的选择

十、Bucket Table简单示例

建立数据文件test_bucket_table.txt

建立表

create table test_bucket_table (key string)

​ clustered by (key)into 20 buckets

加载数据

LOAD DATA INPATH ‘filepath’ INTO TABLE test_bucket_table

查看数据

select * from test_bucket_table

set hive.enforce.bucketing = true;

 

十一、Hive的数据模型-视图

视图与传统数据库的视图相似

视图是只读的

视图基于的基本表,若是改变,指增长不会影响视图的呈现;若是删除,会出现问题

若是不指定视图的列,会根据select语句后的生成

示例

create view test_view as select * from test

 

10.7 Hive的数据存储

配置步骤:

hive-site.xml 添加

<property>

<name>hive.hwi.war.file</name>

<value>lib/hive-hwi-0.8.1.war</value>

</property>

启动Hive的UI sh $HIVE_HOME/bin/hive --service hwi

11 Hive原理

11.1 Hive原理

一、什么要学习Hive的原理

一条Hive HQL将转换为多少道MR做业

怎么样加快Hive的执行速度

编写Hive HQL的时候咱们能够作什么

Hive 怎么将HQL转换为MR做业

Hive会采用什么样的优化方式

三、Hive执行流程

编译器将一个Hive QL转换操做符

操做符是Hive的最小的处理单元

每一个操做符表明HDFS的一个操做或者一道MapReduce做业

 

四、Operator

Operator都是hive定义的一个处理过程

Operator都定义有:

protected List <Operator<? extends Serializable >> childOperators;

protected List <Operator<? extends Serializable >> parentOperators;

protected boolean done; // 初始化值为false

全部的操做构成了 Operator图,hive正是基于这些图关系来处理诸如limit, group by, join等操做。

五、Hive执行流程

操做符 描述
TableScanOperator 扫描hive表数据
ReduceSinkOperator 建立将发送到Reducer端的<Key,Value>对
JoinOperator Join两份数据
SelectOperator 选择输出列
FileSinkOperator 创建结果数据,输出至文件
FilterOperator 过滤输入数据
GroupByOperator GroupBy语句
MapJoinOperator /*+mapjoin(t) */
LimitOperator Limit语句
UnionOperator Union语句

Hive经过ExecMapper和ExecReducer执行MapReduce任务

在执行MapReduce时有两种模式

本地模式

分布式模式

 

六、ANTLR词法语法分析工具

ANTLR—Another Tool for Language Recognition

ANTLR 是开源的

为包括Java,C++,C#在内的语言提供了一个经过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架

Hibernate就是使用了该分析工具

11.2 一条HQL引起的思考

一、案例HQL

select key from test_limit limit 1

Stage-1

TableScan Operator>Select Operator-> Limit->File OutputOperator

Stage-0

Fetch Operator

读取文件

 

二、Mapper与InputFormat

该hive MR做业中指定的mapper是:

mapred.mapper.class = org.apache.hadoop.hive.ql.exec.ExecMapper

input format是:

hive.input.format =

org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

该hive MR做业中指定的mapper是:

mapred.mapper.class = org.apache.hadoop.hive.ql.exec.ExecMapper

input format是:

hive.input.format =

org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

相关文章
相关标签/搜索