Hivejava
Author: Lijbmysql
Email: lijb1121@163.comweb
Hive介紹:sql
hive是基於Hadoop的一個數據倉庫工具,能夠用來進行數據踢羣轉換加載(ETL),這是一種能夠存儲、查詢和分析存儲在Hadoop中的大規模數據機制。能夠將結構化的數據文件映射爲一張數據庫表,並提供簡單的sql查詢功能,能夠將sql語句轉換爲MapReduce任務進行運行。
ETL介紹:數據庫
什麼是etl Extract-Transform-Load):apache
一、用來描述將數據歷來源端通過抽取(extract)、轉換(transform)、加載(load)至目的端的過程。ETL一詞較經常使用在數據倉庫。是一個數據清洗工具 二、實現ETL,首先要實現ETL轉換的過程。體現爲如下幾個方面: 一、空值處理:可捕獲字段空值,進行加載或替換爲其餘含義數據,並可根據字段空值實現分流加載到不一樣目標庫。 二、規範化數據格式:可實現字段格式約束定義,對於數據源中時間、數值、字符等數據,可自定義加載格式。 三、拆分數據:依據業務需求對字段可進行分解。例,主叫號 861082585313-8148,可進行區域碼和電話號碼分解。 四、驗證數據正確性:可利用Lookup及拆分功能進行數據驗證。例如,主叫號861082585313-8148,進行區域碼和電話號碼分解後,可利用Lookup返回主叫網關或交換機記載的主叫地區,進行數據驗證。 五、數據替換:對於因業務因素,可實現無效數據、缺失數據的替換。 六、Lookup:查獲丟失數據 Lookup實現子查詢,並返回用其餘手段獲取的缺失字段,保證字段完整性。 七、創建ETL過程的主外鍵約束:對無依賴性的非法數據,可替換或導出到錯誤數據文件中,保證主鍵惟一記錄的加載。
Hive的架構圖json
driver是hive中內置的核心驅動driver又包括三個組件,Compiler/Optimizer/Excutorcentos
Compiler:會把咱們寫的hql編譯成原生的mapreduce程序 Optimizer:優化器把hql編譯成MR之後,MR會執行提交,Optimizer:會在MR執行提交以前對程序進行一些優化。優化無非就是在job裏面添加不少參數或者配置等策略。 Excutor:執行器,把優化後的mapreduce程序交給hadoop的resourcemanager去處理 總結:編譯--優化--提交到Hadoop的亞組件。 Hive操做方式CLI/JDBC(ODBC)/Web(GUI) CLI:經過客戶端指令去操做 JDBC:sql管理起來 經過jdbc去操做 Web:經過訪問web界面的方式去訪問hive Thrift server:對象的序列化方式,可能jdbc和hive是寫到不一樣的數據庫節點上,因此跨界點通訊的話要進行序列化. Metastore:用來存儲hive中表的元數據的工具,也就是存元數據的指令 元數據:表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),以及表所在的數據存儲目錄等等 derby:數據庫,hive內置了derby數據庫。該數據庫只支持單會話。數據無法共享 mysql:數據能夠共享
Hive的安裝數組
安裝mysql並開啓遠程訪問架構
安裝Hadoop環境並啓動
安裝Hive
[root@centos ~]# tar -zxf apache-hive-1.2.1-bin.tar.gz -C /usr/ [root@centos ~]# vi /usr/apache-hive-1.2.1-bin/conf/hive-site.xml
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://CentOS:3306/hive</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property>
</configuration>
mysql> create database hive; Query OK, 1 row affected (0.00 sec) mysql> show create database hive; +---------- +----------------------------------------------------------------- + | Database | Create Database | +---------- +----------------------------------------------------------------- + | hive | CREATE DATABASE hive
/*!40100 DEFAULT CHARACTER SET latin1 */ | +---------- +----------------------------------------------------------------- + 1 row in set (0.00 sec) mysql> quit Bye [root@centos ~]# cp mysql-connector-java-5.1.46.jar /usr/apache-hive-1.2.1-bin/lib/ [root@centos ~]# cd /usr/apache-hive-1.2.1-bin/ [root@centos apache-hive-1.2.1-bin]# cp lib/jline-2.12.jar /usr/hadoop-2.6.0/share/hadoop/yarn/lib/ [root@centos apache-hive-1.2.1-bin]# rm -rf /usr/hadoop-2.6.0/share/hadoop/yarn/lib/jline-0.9.94.jar
啓動Hive(單機|管理員)
[root@centos apache-hive-1.2.1-bin]# ./bin/hive Logging initialized using configuration in jar:file:/usr/apache-hive-1.2.1-bin/lib/hive-common- 1.2.1.jar!/hive-log4j.properties hive>
多用戶訪問
[root@centos apache-hive-1.2.1-bin]# ./bin/hiveserver2 (服務端) [root@centos apache-hive-1.2.1-bin]# ./bin/beeline -u jdbc:hive2://CentOS:10000 -n root Connecting to jdbc:hive2://CentOS:10000 Connected to: Apache Hive (version 1.2.1) Driver: Hive JDBC (version 1.2.1) Transaction isolation: TRANSACTION_REPEATABLE_READ Beeline version 1.2.1 by Apache Hive
Hive對錶的操做
表分類
HIVE的表按類型 分爲 管理表、外部表、分區表。
管理表:前面章節案例中所建立的表都稱爲管理表,有時候也稱爲內部表。由於這種表hive會控制數據的生命週期(在刪除表的同時也會刪除dhfs上的文本數據)所以管理表不方便和其餘工做共享數據。
外部表: 和管理表比較外部表在建立的時候多一箇中external關鍵字告訴Hive這是外部表,然後面的location則是告訴hive數據位於哪一個位置或者路徑下。由於是外部表hive並不是徹底擁有這些數據,所以在刪除外部表的時候並不會刪除location參數指定路徑的數據。
分區表: 不管外部表仍是管理表均可以在建立的時候指定分區,對於這種指定分區的表稱爲分區表。數據庫分區的概念已經純在好久,其能夠有多種形式,可是一般是使用分區來水平分散壓力,將數據從物理上轉移和使用最頻繁的用戶更接近的地方,以及實現其餘目的。
外部表
1,zhangsan,true,18,15000,TV|Game,001>建設|002>招商,china|bj 2,lisi,true,28,15000,TV|Game,001>建設|002>招商,china|bj 3,wangwu,false,38,5000,TV|Game,001>建設|002>招商,china|sh \------ create external table t_user_c( id int, name string, sex boolean, age int, salary double, hobbies array<string>, card map<string,string>, addressstruct<country:string,city:string> ) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n'; create external table t_user_a( id int, name string, sex boolean, age int, salary double, hobbies array<string>, card map<string,string>, addressstructcountry:string,city:string ) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n' location '/user/hive/warehouse/baizhi.db/t_user_c';
分區表
create external table t_user( id int, name string, sex boolean, age int, salary double, country string, city string ) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n' -------------------- create external table t_user_p( id int, name string, sex boolean, age int, salary double ) partitioned by(country string,city string) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n'
Hive On Hbase
CREATE EXTERNAL tablet_user_hbase( id string, name string, age int, salary int, company string ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITHSERDEPROPERTIES('hbase.columns.mapping' = ':key,cf1:name,cf1:age,cf1:salary,cf1:company')TBLPROPERTIES('hbase.table.name' = 'zpark:t_user');
數據類型
①primitive(原始類型):
整數:TINYINT、SMALLINT、INT、BIGINT
布爾:BOOLEAN
小數:FLOAT、DOUBLE
字符:STRING、CHAR、VARCHAR
二進制:BINARY
時間類型:TIMESTAMP、DATE
②array(數組類型):ARRAY < data_type >
③map(key-value類型):MAP< primitive_type, data_type >
④struct(結構體類型):STRUCT <col_name:data_type, ...>
建表、創建映射關係
create table t_user01(id int,name varchar(40)) load data local inpath '/root/user1.log' into table t_user; load data local inpath '/root/user2.log' overwrite into table t_user2; create table t_order( id int,name varchar(32), num int, price double, tags array<string>, user_id int
默認分割符
分隔符 描述
\n 對於文原本說,每一行都是一條記錄。所以\n能夠分割記錄。
^A(Ctrl+a) 用於分割字段(列),在create table中可使用\001表示。
^B(Ctrl+b) 用於分割array或者是struct中 的元素或者用於map結構中的k-v對的分隔符,在create table
中可使用\002表示。
^C(Ctrl+c) 用於Map中k-v的分隔符,在create table中可使用\003表示。
create table t_user( id int, name string, sex boolean, birthDay date, salary double, hobbies array<string>, card map<string,string>, address struct<country:string,city:string> ) 0: jdbc:hive2://CentOS:10000> desc formatted t_user;
準備數據
將數據導入到表中
#不經常使用 [root@centos ~]# hdfs dfs -put t_user /user/hive/warehouse/baizhi.db/t_user //使用hive加載數據 0: jdbc:hive2://CentOS:10000> load data local inpath '/root/t_user' overwrite into table t_user;
自定義分隔符(用的較多)
1,zhangsan,true,18,15000,TV|Game,001>建設|002>招商,china|bj 2,lisi,true,28,15000,TV|Game,001>建設|002>招商,china|bj 3,wangwu,false,38,5000,TV|Game,001>建設|002>招商,china|sh ------ create table t_user_c( id int, name string, sex boolean, age int, salary double, hobbies array<string>, card map<string,string>, address struct<country:string,city:string> ) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n';
正則匹配
192.168.0.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00 192.168.2.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00 192.168.0.1 xx com.xx.xx.XxxService#xx 2018-10-10 10:10:00 192.168.202.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00 192.168.2.1 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00 192.168.0.2 xx com.xx.xx.XxxService#xx 2018-10-10 10:10:00 192.168.0.2 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00 192.168.2.4 qq com.xx.xx.XxxService#xx 2018-10-10 10:10:00 192.168.0.4 xx com.xx.xx.XxxService#xx 2018-10-10 10:10:00 --------------------- create table t_access( ip string, app varchar(32), service string, last_time string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex"="^(.*)\\s(.*)\\s(.*)\\s(.*\\s.*)" );
CSV格式文件
1,zhangsan,TRUE,20 2,zhangsan,TRUE,21 3,zhangsan,TRUE,22 4,zhangsan,TRUE,23 ------------------ CREATE TABLE my_table( id int, name string, sex boolean, age int ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = ",", "escapeChar" = "\\" );
JSON格式數據
{"id":1,"name":"zhangsan","sex":true,"birth":"1991-02-08"} {"id":2,"name":"lisi","sex":true,"birth":"1991-02-08"} --------------------- ADD|DELETE JAR /usr/apache-hive-1.2.1-bin/hcatalog/share/hcatalog/hive-hcatalog-core-1.2.1.jar ; create table t_user_json( id int, name varchar(32), sex boolean, birth date )ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';
數據的導入/導出(管理員)
INSERT OVERWRITE DIRECTORY /logs/ ROW FORMAT delimited fields terminated by ',' SELECT ip , app,last_time from t_access; 0: jdbc:hive2://CentOS:10000> create table t(id string ,name string); 0: jdbc:hive2://CentOS:10000> INSERT into t(id,name) values(1,'zs'),(2,'ww'); 0: jdbc:hive2://CentOS:10000> insert into table t select ip,last_time from t_access; 0: jdbc:hive2://CentOS:10000> create table temp1 as select ip,last_time from t_access;
表分類
HIVE的表按類型 分爲 管理表、外部表、分區表。
外部表
1,zhangsan,true,18,15000,TV|Game,001>建設|002>招商,china|bj 2,lisi,true,28,15000,TV|Game,001>建設|002>招商,china|bj 3,wangwu,false,38,5000,TV|Game,001>建設|002>招商,china|sh \------ create external table t_user_c( id int, name string, sex boolean, age int, salary double, hobbies array<string>, card map<string,string>, addressstruct<country:string,city:string> ) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n'; create external table t_user_a( id int, name string, sex boolean, age int, salary double, hobbies array<string>, card map<string,string>, addressstructcountry:string,city:string ) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n' location '/user/hive/warehouse/baizhi.db/t_user_c';
分區表
create external table t_user( id int, name string, sex boolean, age int, salary double, country string, city string ) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n' -------------------- create external table t_user_p( id int, name string, sex boolean, age int, salary double ) partitioned by(country string,city string) row format delimited fields terminated by ',' collection items terminated by '|' map keys terminated by '>' lines terminated by '\n'
Hive On Hbase
CREATE EXTERNAL tablet_user_hbase( id string, name string, age int, salary int, company string ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITHSERDEPROPERTIES('hbase.columns.mapping' = ':key,cf1:name,cf1:age,cf1:salary,cf1:company')TBLPROPERTIES('hbase.table.name' = 'zpark:t_user');
Linux上刷新mysql權限:flush privileges;
啓動mysql: service mysqld start e
進入MySQL:mysql -uroot -p
使用數據庫: use test
查看錶: show tables
...