Hadoop生態上幾個技術的關系與區別:hive、pig、hbase 關系與區別


Hadoop生態上幾個技術的關系與區別:hive、pig、hbase 關系與區別

Pig

一種操作hadoop的輕量級腳本語言,最初又雅虎公司推出,不過現在正在走下坡路了。當初雅虎自己慢慢退出pig的維護之后將它開源貢獻到開源社區由所有愛好者來維護。不過現在還是有些公司在用,不過我認為與其使用pig不如使用hive。:)

Pig是一種數據流語言,用來快速輕松的處理巨大的數據。

Pig包含兩個部分:Pig Interface,Pig Latin。

Pig可以非常方便的處理HDFS和HBase的數據,和Hive一樣,Pig可以非常高效的處理其需要做的,通過直接操作Pig查詢可以節省大量的勞動和時間。當你想在你的數據上做一些轉換,並且不想編寫MapReduce jobs就可以用Pig.

Hive

不想用程序語言開發MapReduce的朋友比如DB們,熟悉SQL的朋友可以使用Hive開離線的進行數據處理與分析工作。

注意Hive現在適合在離線下進行數據的操作,就是說不適合在掛在真實的生產環境中進行實時的在線查詢或操作,因為一個字“慢”。相反

起源於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高效的多。

介紹:

一、什么是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中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。

二、hive的體系架構:

用戶接口,包括 CLI(shell),JDBC/ODBC,WebUI(通過瀏覽器)

元數據存儲,通常是存儲在關系數據庫如 mysql, derby 中

解釋器、編譯器、優化器、執行器完成HQL查詢語句從語法分析,編譯,優化以及查詢計划的生成,生成的查詢計划存儲在HDFS中,並隨后被mapreduce調用執行

Hadoop:用 HDFS 進行存儲,利用 MapReduce 進行計算(帶*的查詢select * from teacher不會生成mapreduce任務,只是進行全表掃描)

 

在此強調:

Hadoop,zookpeer,spark,kafka,mysql已經正常啟動

三、開始安裝部署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,下載:

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/

 

二、安裝好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

四、啟動

[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

1、面臨的問題

​ 人員學習成本太高

​ 項目周期要求太短

​ 我只是需要一個簡單的環境

MapReduce 如何搞定

復雜查詢好難

​ Join如何實現

2、為什么要使用Hive

操作接口采用類SQL語法,提供快速開發的能力

避免了去寫MapReduce,減少開發人員的學習成本

擴展功能很方便

 

1.3 Hive特點

1、可擴展

Hive可以自由的擴展集群的規模,一般情況下不需要重啟服務

2、延展性

Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數

3、容錯

良好的容錯性,節點出現問題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配置文件介紹

1、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默認配置

2、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>

3、hive-env.sh

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

配置Hadoop的安裝路徑:HADOOP_HOME=your hadoop home

 

2.5 使用Derby數據庫的安裝方式

1、什么是Derby安裝方式

ApacheDerby是一個完全用java編寫的數據庫,所以可以跨平台,但需要在JVM中運行

Derby是一個Open source的產品,基於Apache License 2.0分發

即將元數據存儲在Derby數據庫中,也是Hive默認的安裝方式。

 

2、安裝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:.

 

3、配置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

4、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>

 

5、啟動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>

 

5、測試語句

​ 建立測試表test

createtable test (key string);

showtables;

2.6 使用MySQL數據庫的安裝方式

1、安裝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;

 

2、安裝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:.

3、修改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>

4、啟動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>

 

5、測試語句

建立測試表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>)

類型轉換函數

 

1、加法操作: +

語法: A + B

操作類型:所有數值類型

說明:返回A與B相加的結果。結果的數值類型等於A的類型和B的類型的最小父類型(詳見數據類型的繼承關系)。比如,int + int 一般結果為int類型,而int + double 一般結果為double類型

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

 

2、減法操作: -

語法: A – B

操作類型:所有數值類型

說明:返回A與B相減的結果。結果的數值類型等於A的類型和B的類型的最小父類型(詳見數據類型的繼承關系)。比如,int – int 一般結果為int類型,而int – double 一般結果為double類型

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

 

3、乘法操作 : *

語法: A * B

操作類型:所有數值類型

說明:返回A與B相乘的結果。結果的數值類型等於A的類型和B的類型的最小父類型(詳見數據類型的繼承關系)。注意,如果A乘以B的結果超過默認結果類型的數值范圍,則需要通過cast將結果轉換成范圍更大的數值類型

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

 

4、除法操作 : /

語法: 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

 

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

 

6、位與操作 : &

語法: A & B

操作類型:所有數值類型

說明:返回A和B按位進行與操作的結果。結果的數值類型等於A的類型和B的類型的最小父類型(詳見數據類型的繼承關系)。

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

hive> select 6 & 4 from dual;4

 

7、位或操作 : |

語法: A | B

操作類型:所有數值類型

說明:返回A和B按位進行或操作的結果。結果的數值類型等於A的類型和B的類型的最小父類型(詳見數據類型的繼承關系)。

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

hive> select 6 | 8 from dual; 14

 

8、位異或操作 : ^

語法: A ^ B

操作類型:所有數值類型

說明:返回A和B按位進行異或操作的結果。結果的數值類型等於A的類型和B的類型的最小父類型(詳見數據類型的繼承關系)。

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

hive> select 6 ^ 4 from dual; 2

 

9、位取反操作 : ~

語法: ~A

操作類型:所有數值類型

說明:返回A按位取反操作的結果。結果的數值類型等於A的類型。

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

hive> select ~4 from dual; -5

 

10、邏輯與操作 : 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

 

11、邏輯或操作 : 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

 

12、邏輯非操作 : NOT

語法: NOT A

操作類型:boolean

說明:如果A為FALSE,或者A為NULL,則為TRUE;否則為FALSE

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

 

13、取整函數 : 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

 

14、指定精度取整函數 : round

語法: round(double a, int d)

返回值: DOUBLE

說明: 返回指定精度d的double類型

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

 

15、向下取整函數 : floor

語法: floor(double a)

返回值: BIGINT

說明: 返回等於或者小於該double變量的最大的整數

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

hive> select floor(25) from dual; 25

 

16、向上取整函數 : ceil

語法: ceil(double a)

返回值: BIGINT

說明: 返回等於或者大於該double變量的最小的整數

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

hive> select ceil(46) from dual; 46

 

17、向上取整函數 : ceiling

語法: ceiling(double a)

返回值: BIGINT

說明: 與ceil功能相同

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

hive> select ceiling(46) from dual; 46

 

18、取隨機數函數 : rand

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

返回值: double

說明: 返回一個0到1范圍內的隨機數。如果指定種子seed,則會等到一個穩定的隨機數序列

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

 

19、自然指數函數 : exp

語法: exp(double a)

返回值: double

說明: 返回自然對數e的a次方

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

 

20、自然對數函數: ln

語法: ln(double a)

返回值: double

說明: 返回a的自然對數

 

21、以 10 為底對數函數 :log10

語法: log10(double a)

返回值: double

說明: 返回以10為底的a的對數

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

 

22、以 2 為底對數函數 :log2

語法: log2(double a)

返回值: double

說明: 返回以2為底的a的對數

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

 

23、對數函數 : log

語法: log(double base, double a)

返回值: double

說明: 返回以base為底的a的對數

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

 

24、冪運算函數 : pow

語法: pow(double a, double p)

返回值: double

說明: 返回a的p次冪

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

 

25、開平方函數 : sqrt

語法: sqrt(double a)

返回值: double

說明: 返回a的平方根

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

 

26、二進制函數 : bin

語法: bin(BIGINT a)

返回值: string

說明: 返回a的二進制代碼表示

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

 

27、十六進制函數 : hex

語法: hex(BIGINT a)

返回值: string

說明: 如果變量是int類型,那么返回a的十六進制表示;如果變量是string類型,則返回該字符串的十六進制表示

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

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

 

28、反轉十六進制函數 : unhex

語法: unhex(string a)

返回值: string

說明: 返回該十六進制字符串所代碼的字符串

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

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

hive> select unhex(616263) from dual; abc

 

29、進制轉換函數 : 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

 

31、正取余函數 : 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

 

32、正弦函數 : sin

語法: sin(double a)

返回值: double

說明: 返回a的正弦值

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

 

33、反正弦函數 : asin

語法: asin(double a)

返回值: double

說明: 返回a的反正弦值

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

 

34、余弦函數 : cos

語法: cos(double a)

返回值: double

說明: 返回a的余弦值

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

 

35、反余弦函數 : acos

語法: acos(double a)

返回值: double

說明: 返回a的反余弦值

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

 

36、positive 函數 : positive

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

返回值: int double

說明: 返回a

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

hive> select positive(12) from dual; 12

 

37、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

 

38、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

 

39、獲取當前 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

 

41、指定格式日期轉 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

 

42、日期時間轉日期函數 : to_date

語法: to_date(string timestamp)

返回值: string

說明: 返回日期時間字段中的日期部分。

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

 

43、日期轉年函數 : 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

 

44、日期轉月函數 : 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

 

45、日期轉天函數 : 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

 

46、日期轉小時函數 : hour

語法: hour (string date)

返回值: int

說明: 返回日期中的小時。

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

 

47、日期轉分鍾函數 : minute

語法: minute (string date)

返回值: int

說明: 返回日期中的分鍾。

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

 

48、日期轉秒函數 : second

語法: second (string date)

返回值: int

說明: 返回日期中的秒。

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

 

49、日期轉周函數 : 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

 

51、日期增加函數 : date_add

語法: date_add(string startdate, int days)

返回值: string

說明: 返回開始日期startdate增加days天后的日期。

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

 

52、日期減少函數 : date_sub

語法: date_sub (string startdate, int days)

返回值: string

說明: 返回開始日期startdate減少days天后的日期。

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

 

53、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

 

54、非空查找函數 : COALESCE

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

返回值: T

說明: 返回參數中的第一個非空值;如果所有值都為NULL,那么返回NULL

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

 

55、條件判斷函數: 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

 

56、字符串長度函數: length

語法: length(string A)

返回值: int

說明:返回字符串A的長度

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

 

57、字符串反轉函數: reverse

語法: reverse(string A)

返回值: string

說明:返回字符串A的反轉結果

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

 

58、字符串連接函數: concat

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

返回值: string

說明:返回輸入字符串連接后的結果,支持任意個輸入字符串

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

abcdefgh

 

59、帶分隔符字符串連接函數: 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

 

61、字符串截取函數: 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

 

62、字符串轉大寫函數: upper,ucase

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

返回值: string

說明:返回字符串A的大寫格式

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

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

 

63、字符串轉小寫函數: lower,lcase

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

返回值: string

說明:返回字符串A的小寫格式

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

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

 

64、去空格函數: trim

語法: trim(string A)

返回值: string

說明:去除字符串兩邊的空格

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

 

65、左邊去空格函數: ltrim

語法: ltrim(string A)

返回值: string

說明:去除字符串左邊的空格

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

 

64、右邊去空格函數: rtrim

語法: rtrim(string A)

返回值: string

說明:去除字符串右邊的空格

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

 

65、正則表達式替換函數: 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

 

66、正則表達式解析函數: 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;

 

67、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

 

68、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

 

69、空格字符串函數: 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

 

71、首字符 ascii 函數: ascii

語法: ascii(string str)

返回值: int

說明:返回字符串str第一個字符的ascii碼

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

 

72、左補足函數: lpad

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

返回值: string

說明:將str進行用pad進行左補足到len位

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

注意:與 GP , ORACLE 不同, pad 不能默認

 

73、右補足函數: rpad

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

返回值: string

說明:將str進行用pad進行右補足到len位

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

 

74、分割字符串函數 : split

語法: split(stringstr, string pat)

返回值: array

說明: 按照pat字符串分割str,會返回分割后的字符串數組

舉例:

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

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

 

75、集合查找函數 : 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

 

76、集合統計函數

語法: 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

 

77、總和統計函數 : 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

78、平均值統計函數 : 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

 

79、最小值統計函數 : min

語法: min(col)

返回值: double

說明: 統計結果集中col字段的最小值

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

 

80、最大值統計函數 : max

語法: maxcol)

返回值: double

說明: 統計結果集中col字段的最大值

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

 

81、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"}

 

82、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"}

 

83、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"]

 

84、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

 

85、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

 

86、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

 

87、Map 類型長度函數 :size(Map<K.V>)

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

返回值: int

說明: 返回map類型的長度

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

 

88、array 類型長度函數 :size(Array<T>)

語法: size(Array<T>)

返回值: int

說明: 返回array類型的長度

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

 

89、類型轉換函數

類型轉換函數: cast

語法: cast(expr as <type>)

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

說明: 返回array類型的長度

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

 

4 Hive JDBC

4.1 基本操作對象的介紹

1、Connection

說明:與Hive連接的Connection對象

Hive的連接

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

獲取Connection的方法

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

2、Statement

說明: 用於執行語句

創建方法

Statementstmt = con.createStatement();

主要方法

executeQuery

execute

3、ResultSet

說明:用來存儲結果集

創建方法

1

stmt.executeQuery

主要方法

1

getString()

4、特殊類型的處理

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 傳輸數據

1、用戶自定義函數

雖然Hive提供了很多函數,但是有些還是難以滿足我們的需求。因此Hive提供了自定義函數開發

自定義函數包括三種UDF、UADF、UDTF

UDF(User-Defined-Function)

UDAF(User- Defined Aggregation Funcation)

UDTF(User-DefinedTable-Generating Functions) 用來解決 輸入一行輸出多行(On-to-many maping) 的需求。

2、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

1、DDL功能

建表

刪除表

修改表結構

創建/刪除視圖

創建數據庫

顯示命令

增加分區、刪除分區

重命名表

修改列的名字、類型、位置、注釋

增加/更新列

增加表的元數據信息

 

2、建表

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

1、DML功能

向數據表內加載文件

將查詢結果插入到Hive表中

0.8新特性 insert into

2、向數據表內加載文件

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

 

3、向數據表內加載文件

加載的目標可以是一個表或者分區。如果表包含分區,必須指定每一個分區的分區名

filepath 可以引用一個文件(這種情況下,Hive 會將文件移動到表所對應的目錄中)或者是一個目錄(在這種情況下,Hive 會將目錄中的所有文件移動至表所對應的目錄中)

 

4、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)所指定的路徑中

5、OVERWRITE

指定了OVERWRITE

目標表(或者分區)中的內容(如果有)會被刪除,然后再將 filepath 指向的文件/目錄中的內容添加到表/分區中。

如果目標表(分區)已經有一個文件,並且文件名和 filepath 中的文件名沖突,那么現有的文件會被新文件所替代。

 

6、將查詢結果插入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

7、將查詢結果寫入HDFS文件系統

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

​ FROMfrom_statement

​ INSERTOVERWRITE [LOCAL] DIRECTORY directory1 select_statement1

​ [INSERTOVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]

數據寫入文件系統時進行文本序列化,且每列用^A 來區分,\n換行

8、INSERT INTO

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

 

7.3 HiveQL 查詢操作

1、SQL操作

基本的Select 操作

基於Partition的查詢

Join

 

2、基本的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 只在本機做排序

3、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 子句中,才會啟用分區剪枝

4、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 序列中除了最后一個表的所有表的記錄,再通過最后一個表將結果序列化到文件系統

實踐中,應該把最大的那個表寫在最后

5、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應該轉變的幾個習慣

1、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;

 

2、分號字符

分號是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;

 

3、IS [NOT]NULL

SQL中null代表空值, 值得警惕的是, 在HiveQL中String類型的字段若是空(empty)字符串, 即長度為0, 那么對它進行ISNULL的判斷結果是False。

8 Hive Shell操作

8.1 Hive bin下腳本介紹

8.2 Hive Shell 基本操作

1、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 計算框架的特性

1、什么是數據傾斜

由於數據的不均衡原因,導致數據分布不均勻,造成數據大量的集中到一點,造成數據熱點。

 

2、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

合並小文件

1、全排序

Hive的排序關鍵字是SORTBY,它有意區別於傳統數據庫的ORDER BY也是為了強調兩者的區別–SORT BY只能在單機范圍內排序。

 

2、怎樣做笛卡爾積

當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為隨機數

 

3、控制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),那么會拆分,如果小於塊大小,則把該文件當成一個塊

4、怎樣決定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

5、合並 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操作。

 

6、Bucket 與 Sampling

Bucket是指將數據以指定列的值為key進行hash,hash到指定數目的桶中。這樣就可以支持高效采樣了

Sampling可以在全體數據上進行采樣,這樣效率自然就低,它還是要去訪問所有數據。而如果一個表已經對某一列制作了bucket,就可以采樣所有桶中指定序號的某個桶,這就減少了訪問量。

如下例所示就是采樣了test中32個桶中的第三個桶。

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

 

7、JOIN 原則

在使用寫有 Join 操作的查詢語句時有一條原則:應該將條目少的表/子查詢放在 Join 操作符的左邊

原因是在 Join 操作的 Reduce 階段,位於 Join 操作符左邊的表的內容會被加載進內存,將條目少的表放在左邊,可以有效減少發生 OOM 錯誤的幾率。

8、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

 

9、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 中),最后完成最終的聚合操作。

 

10、合並小文件

文件數目過多,會給 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架構與基本組成

1、架構圖

2、基本組成

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

元數據存儲,通常是存儲在關系數據庫如 mysql, derby 中

解釋器、編譯器、優化器、執行器

Hadoop:用HDFS 進行存儲,利用 MapReduce 進行計算

3、各組件的基本功能

用戶接口主要有三個: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 任務)

4、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)

 

5、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 數據類型

1、原始數據類型

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

 

2、復雜數據類型

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的元數據存儲

1、存儲方式與模式

Hive將元數據存儲在數據庫中

連接到數據庫模式有三種

單用戶模式

多用戶模式

遠程服務器模式

 

2、單用戶模式

此模式連接到一個 In-memory 的數據庫 Derby ,一般用於 Unit Test

10.6 Hive的數據存儲

1、Hive數據存儲的基本概念

Hive的數據存儲是建立在Hadoop HDFS之上的

Hive沒有專門的數據存儲格式

存儲結構主要包括:數據庫、文件、表、視圖

Hive默認可以直接加載文本文件,還支持sequence file 、RCFile

創建表時,我們直接告訴Hive數據的列分隔符與行分隔符,Hive即可解析數據

 

2、Hive的數據模型-數據庫

類似傳統數據庫的DataBase

在第三方數據庫里實際是一張表

簡單示例:命令行hive > create database test_database;

 

3、內部表

與數據庫中的 Table 在概念上是類似

每一個 Table 在 Hive 中都有一個相應的目錄存儲數據

例如,一個表 test,它在 HDFS 中的路徑為:/warehouse /test

warehouse是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir}指定的數據倉庫的目錄

所有的 Table 數據(不包括 External Table)都保存在這個目錄中。

刪除表時,元數據與數據都會被刪除

4、內部表簡單示例

創建數據文件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

 

5、分區表

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

6、分區表簡單示例

創建數據文件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

 

7、外部表

指向已經在 HDFS 中存在的數據,可以創建 Partition

它和 內部表 在元數據的組織上是相同的,而實際數據的存儲則有較大的差異

內部表 ** 的創建過程和數據加載過程(這兩個過程可以在同一個語句中完成),在加載數據的過程中,實**


際數據會被移動到數據倉庫目錄中;之后對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表


中的數據和元數據將會被同時刪除



外部表 **只有一個過程,加載數據和創建表同時完成,並不會移動到數據倉庫目錄中,只是與外部數據**


建**立一個鏈接。當刪除一個外部表 時,僅刪除該鏈接**

8、外部表簡單示例

創建數據文件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

 

9、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任務這樣是不錯的選擇

10、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;

 

11、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原理

1、什么要學習Hive的原理

一條Hive HQL將轉換為多少道MR作業

怎么樣加快Hive的執行速度

編寫Hive HQL的時候我們可以做什么

Hive 怎么將HQL轉換為MR作業

Hive會采用什么樣的優化方式

3、Hive執行流程

編譯器將一個Hive QL轉換操作符

操作符是Hive的最小的處理單元

每個操作符代表HDFS的一個操作或者一道MapReduce作業

 

4、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等操作。

5、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時有兩種模式

本地模式

分布式模式

 

6、ANTLR詞法語法分析工具

ANTLR—Another Tool for Language Recognition

ANTLR 是開源的

為包括Java,C++,C#在內的語言提供了一個通過語法描述來自動構造自定義語言的識別器(recognizer),編譯器(parser)和解釋器(translator)的框架

Hibernate就是使用了該分析工具

11.2 一條HQL引發的思考

1、案例HQL

select key from test_limit limit 1

Stage-1

TableScan Operator>Select Operator-> Limit->File OutputOperator

Stage-0

Fetch Operator

讀取文件

 

2、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM