大數據之Hive

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的表按類型 分爲 管理表、外部表、分區表。

  • 管理表:前面章節案例中所建立的表都稱爲管理表,有時候也稱爲內部表。由於這種表hive會控制數據的生命週期(在刪除表的同時也會刪除hdfs上的文本數據)所以管理表不方便和其餘工做共享數據。
  • 外部表: 和管理表比較外部表在建立的時候多一箇中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');

Linux上刷新mysql權限:flush privileges;

啓動mysql: service mysqld start e

進入MySQL:mysql -uroot -p

使用數據庫: use test

查看錶: show tables

...

相關文章
相關標籤/搜索