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