1. 程式人生 > >HIVE的安裝配置、mysql的安裝、hive建立表、建立分割槽、修改表等內容、hive beeline使用、HIVE的四種資料匯入方式、使用Java程式碼執行hive的sql命令

HIVE的安裝配置、mysql的安裝、hive建立表、建立分割槽、修改表等內容、hive beeline使用、HIVE的四種資料匯入方式、使用Java程式碼執行hive的sql命令

1.上傳tar包
這裡我上傳的是apache-hive-1.2.1-bin.tar.gz

2.解壓

mkdir -p /home/tuzq/software/hive/

tar -zxvf apache-hive-1.2.1-bin.tar.gz  -C /home/tuzq/software/hive/
3.安裝mysql資料庫(切換到root使用者)(裝在哪裡沒有限制,只有能聯通hadoop叢集的節點)
mysql安裝可以參考:http://blog.csdn.net/tototuzuoquan/article/details/52711808

mysql安裝僅供參考,不同版本mysql有各自的安裝流程

rpm -qa | grep mysql
rpm -e mysql-libs-5.1.66-2.el6_3.i686 --nodeps
rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rpm 
rpm -ivh MySQL-client-5.1.73-1.glibc23.i386.rpm 
修改mysql的密碼
/usr/bin/mysql_secure_installation
(注意:刪除匿名使用者,允許使用者遠端連線)
登陸mysql
mysql -u root -p


4.配置hive

(a)配置HIVE_HOME環境變數

vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_73
export HADOOP_HOME=/home/tuzq/software/hadoop-2.8.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HIVE_HOME=/home/tuzq/software/hive/apache-hive-1.2.1-bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin


source /etc/profile
將hadoop叢集中的其它的環境變數也配置成這種,如我的hadoop叢集是hadoop1,hadoop2,hadoop3,hadoop4,hadoop5。這些我都配置成了上面的同樣的環境變數

 [[email protected] conf]# cd $HIVE_HOME/conf

 [[email protected] conf]# mv hive-env.sh.template hive-env.sh

 [[email protected] conf]# vi $HIVE_HOME/conf/hive-env.sh

配置其中的$hadoop_home

新增:

export HIVE_CONF_DIR=/home/bigdata/installed/hive-2.3.2/conf


(b)配置元資料庫資訊   

在$HIVE_HOME/conf檔案加下,建立hive-site.xml檔案,檔案內容如下:

vi  hive-site.xml 

新增如下內容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop10:3306/hive?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8</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>root</value>
        <description>username to use against metastore database</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>root</value>
        <description>password to use against metastore database</description>
    </property>
</configuration>

5.安裝hive和mysq完成後,將mysql的連線jar包拷貝到$HIVE_HOME/lib目錄

如果出現沒有許可權的問題,在mysql授權(在安裝mysql的機器上執行)
mysql -uroot -p
#(執行下面的語句  *.*:所有庫下的所有表   %:任何IP地址或主機都可以連線)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;


6. 如果hadoop使用的是2.6.4版本的,會存在Jline包版本不一致的問題,需要拷貝hive的lib目錄中jline.2.12.jar的jar包替換掉hadoop中的 
/home/hadoop/app/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar

如果是hadoop-2.8.0版本的,發現在/home/tuzq/software/hadoop-2.8.0/share/hadoop/yarn/lib下沒有jline-2.12.jar

下面的命令是檢視HIVE中的jline的版本號的方式:

[[email protected] lib]# cd $HIVE_HOME/lib
[[email protected] lib]# ls jline-2.12.jar 
jline-2.12.jar
[[email protected] lib]#

將建立好的hive遠端拷貝到hadoop2,hadoop3,hadoop4,hadoop5伺服器上的相同位置

scp -r /home/tuzq/software/hive* [email protected]:/home/tuzq/software/

scp -r /home/tuzq/software/hive* [email protected]:/home/tuzq/software/

scp -r /home/tuzq/software/hive* [email protected]:/home/tuzq/software/

scp -r /home/tuzq/software/hive* [email protected]:/home/tuzq/software/

使用schematool初始化hive的表

cd /home/bigdata/installed/hive-2.3.2/bin

然後執行:

[[email protected] bin]$ ./schematool -dbType mysql -initSchema


為了解決hive出現的亂碼,解決辦法是:

因為我們知道 metastore 支援資料庫級別,表級別的字符集是 latin1,那麼我們只需要把相應註釋的地方的字符集由 latin1 改成 utf-8,就可以了。用到註釋的就三個地方,表、分割槽、檢視。如下修改分為兩個步驟:

執行下面的操作:

(1)、進入資料庫 Metastore 中執行以下 5 條 SQL 語句 
 ①修改表字段註解和表註解
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8
② 修改分割槽欄位註解:
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8 ;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
③修改索引註解:
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

啟動hive
bin/hive
執行完成之後,到mysql中進行檢視,發現現象如下:

另外:通過Hive beeline也可以訪問hive:

---Beeline要與HiveServer2配合使用,支援嵌入式模式和遠端模式

--啟動HiverServer2 ,./bin/hiveserver2

命令模式:

hive --service hiveserver2 --hiveconf hive.server2.thrift.port=10001

最後面的port可以更改,hiveserver2預設的埠號是10000。beeline的退出方式:!quit

[[email protected] apache-hive-1.2.1-bin]# bin/beeline 
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://hadoop1:10000
Connecting to jdbc:hive2://hadoop1:10000
Enter username for jdbc:hive2://hadoop1:10000: 
Enter password for jdbc:hive2://hadoop1:10000: 
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop1:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
| mydb           |
| userdb         |
| userdb2        |
| userdb3        |
+----------------+--+
5 rows selected (0.709 seconds)
0: jdbc:hive2://hadoop1:10000>

啟動hiveserver2 和 hivemetastore

[[email protected] hive-2.3.2]# cd $HIVE_HOME/bin

hivemetastore   啟動方式: nohup hive --service metastore &

hiveserver2        啟動方式:  nohup hive --service hiveserver2 &
----------------------------------------------------------------------------------------------------
檢視有哪些表:

[[email protected] apache-hive-1.2.1-bin]# bin/hive

Logging initialized using configuration in jar:file:/home/tuzq/software/hive/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> show databases;   #顯示所有的資料庫
OK
default
Time taken: 0.98 seconds, Fetched: 1 row(s)
hive> create database db1; #建立一個數據庫
OK
Time taken: 0.239 seconds
hive> show databases; #顯示所有的資料庫
OK
db1
default
Time taken: 0.015 seconds, Fetched: 2 row(s)
hive>

然後進入hdfs上進行檢視http://hadoop1:50070/ :

6.建表(預設是內部表)

        use db1; 

hive> create table trade_detail(id bigint,account string,income double,expense double,time string)

row format delimited fields terminated by '\t';

進入hdfs進行檢視:

select nation, avg(size) from beauties group by nation order by avg(size);

        注意如果在此過程中獲取的結果是NULL的,說明建立表的時候需要加上:lines terminated by '\n' 

        如果想通過drop table if exists table_name刪除表時刪除不了,請換$HIVE_HOME/lib中的mysql-connector-java。比如我使用的是:mysql-5.7.15-linux-glibc2.5-x86_64.tar.gz,開始的時候使用的是mysql-connector-java-5.1.7.jar,最後換成mysql-connector-java-5.1.38.jar,發現就可以drop表了。

檢視database,刪除資料庫

以下是使用CASCADE查詢刪除資料庫。這意味著要全部刪除相應的表在刪除資料庫之前:

hive> show databases;
OK
default
mydb
userdb
userdb2
userdb3
Time taken: 0.962 seconds, Fetched: 5 row(s)
hive> drop database IF EXISTS  userdb3 CASCADE;
OK
Time taken: 0.203 seconds

hive> show databases;
OK
default
mydb
userdb
userdb2
Time taken: 0.014 seconds, Fetched: 4 row(s)
hive>

修改表

Alter Table語句,它是在Hive中用來修改表的

語法

ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
hive> show tables;
OK
testhivedrivertable
Time taken: 0.029 seconds, Fetched: 1 row(s)
hive> ALTER TABLE testhivedrivertable RENAME To testHive;
OK
Time taken: 0.345 seconds
hive> show tables;
OK
testhive
Time taken: 0.031 seconds, Fetched: 1 row(s)

修改列中列的型別:

hive> desc testhive;
OK
key                 int                                    
value              string                                     
Time taken: 0.161 seconds, Fetched: 2 row(s)

hive> ALTER TABLE testhive CHANGE value value Double;
OK
Time taken: 0.251 seconds
hive> desc testhive;
OK
key                 int                                    
value               double                                     
Time taken: 0.126 seconds, Fetched: 2 row(s)
hive>

為表新增一列:

hive> ALTER TABLE testhive ADD COLUMNS (
    > dept STRING COMMENT 'Departname name');

OK
Time taken: 0.219 seconds
hive> desc testhive;
OK
key                 int                                    
value               double                                     
dept                    string                  Departname name     
Time taken: 0.09 seconds, Fetched: 3 row(s)
hive>

刪除表

刪除表的語法是:

hive>DROP TABLE IF EXISTS testhive;

建立分割槽

Hive組織表到分割槽。它是將一個表到基於分割槽列,如日期,城市和部門的值相關方式。使用分割槽,很容易對資料進行部分查詢。很容易對資料進行部分查詢。

表或分割槽是細分成桶,以提供額外的結構,可以使用更高效的查詢的資料。桶的工作是基於表的一些列的雜湊函式值。

新增分割槽,語法是:

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
partition_spec:
:(p_column = p_col_value, p_column = p_col_value, ...)

先做準備工作,建立表:

CREATE TABLE IF NOT EXISTS employee (eid int, name String,
    destination String)
    partitioned by (salary String)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    LINES TERMINATED BY '\n'
    STORED AS TEXTFILE;

hive>desc employee;

經過上面步驟,表已經添加了一個分割槽

匯入資料:

[[email protected] hivedata]# cat /home/tuzq/software/hivedata/sample.txt 
1201    pal    45000    Technical manager
1202    Manisha    45000    Proof reader
[[email protected] hivedata]#

將上面的資料匯入到分割槽:

LOAD DATA LOCAL INPATH '/home/tuzq/software/hivedata/sample.txt' INTO TABLE employee PARTITION(salary = '45000');

注意上滿的紅字,表示將資料新增到45000這個分割槽中。

在hdfs上的效果如下:

http://hadoop1:50070/explorer.html#/user/hive/warehouse/userdb.db/employee

下面再次給表新增另外一個分割槽值:

ALTER TABLE employee ADD PARTITION (salary ='40000') location '/40000/part40000';

新增location之後,它在HDFS上的位置將會改變,將會到/40000/part40000中。效果圖如下:

http://hadoop1:50070/explorer.html#/40000/part40000

建立2個分割槽的方式:

雙分割槽建表語句:create table table_name (id int, content string) partitioned by (dt string, hour string);雙分割槽表,按天和小時分割槽,在表結構中新增加了dt和hour兩列。
先以dt為資料夾,再以hour子資料夾區分

檢視分割槽語句:

hive> show partitions employee;
OK
salary=40000
salary=45000
Time taken: 0.088 seconds, Fetched: 2 row(s)
hive>

再如:

建分割槽表
hive> 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';
       OK
       Time taken: 0.114 seconds
       hive> show tables;
       OK
       td_part
       trade_detail
       Time taken: 0.021 seconds, Fetched: 2 row(s)

       hive>

建外部表
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';


7.建立分割槽表
普通表和分割槽表區別:有大量資料增加的需要建分割槽表
hive> create table book(id bigint,name string) partitioned by (pubdate string) row format delimited fields terminated by '\t';
OK
Time taken: 0.108 seconds
hive> show tables;
OK
book
td_part-
trade_detail
Time taken: 0.02 seconds, Fetched: 3 row(s)
hive>


分割槽表載入資料
load data local inpath './book.txt' overwrite into table book partition (pubdate='2010-08-22');

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


建立檢視和索引

檢視在Hive的用法和SQL檢視用法相同。它是一個標準的RDBMS概念。我們可以在檢視上執行DML操作。

建立檢視的語法如下:

CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT table_comment]
AS SELECT ...

hive> desc employee;
OK
eid                 int                                    
name                    string                                     
destination         string                                     
salary                  string                                     
 
# Partition Information     
# col_name                data_type           comment             
 
salary                  string                                     
Time taken: 0.08 seconds, Fetched: 9 row(s)
hive> create VIEW emp_45000 AS
    > SELECT * FROM employee
    > WHERE salary = 45000;

刪除一個檢視的方式:

hive > DROP VIEW emp_45000;

建立索引:

建立索引的語法如下:

CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
   [ ROW FORMAT ...] STORED AS ...
   | STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]

HIVE的四種資料匯入方式:

HIVE的幾種常見的資料匯入方式,這裡介紹四種:

(1)、從本地檔案系統中匯入資料到Hive表;

(2)、從HDFS上匯入資料到Hive表

(3)、從別的表中查詢出相應的資料並匯入到Hive表中。

(4)、在建立表的時候通過從別的表中查詢出相應的記錄並插入到所建立的表中。

一、從本地檔案系統中匯入資料到Hive表

先在Hive裡面建立好表,如下:

hive> create table wyp(id int,name string,age int,tel string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' lines terminated by '\n' STORED AS TEXTFILE;

注意上面的:ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '      注意這個分割的字元,若是設定的不好,最後能夠插入資料庫,但是select出來的結果是NULL.

這個表很簡單,只有四個欄位。本地檔案系統裡有/home/tuzq/software/hive/apache-hive-1.2.1-bin/wyp.txt 檔案,內容如下:
[[email protected] apache-hive-1.2.1-bin]# pwd
/home/tuzq/software/hive/apache-hive-1.2.1-bin
[[email protected] apache-hive-1.2.1-bin]# cat wyp.txt 
1 wyp 25 13188888888888
2 test 30 13888888888888
3 zs 34 899314121
[[email protected] apache-hive-1.2.1-bin]#


wyp.txt檔案中的資料列之間使用空格分割的,可以通過下面的語句將這個檔案裡面的資料匯入到wyp表裡面,操作如下:

hive> load data local inpath '/home/tuzq/software/hive/apache-hive-1.2.1-bin/wyp.txt' into table wyp;
Loading data to table default.wyp
Table default.wyp stats: [numFiles=1, totalSize=67]
OK
Time taken: 0.35 seconds
hive> select * from wyp;
OK
1    wyp    25    13188888888888
2    test    30    13888888888888
3    zs    34    899314121
Time taken: 0.086 seconds, Fetched: 3 row(s)
hive>

這樣就將wyp.txt裡面的內容匯入到wyp表裡面去了,可以到wyp表的資料目錄下檢視,http://hadoop1:50070/explorer.html#/user/hive/warehouse/db1.db:
二、HDFS上匯入資料到hive表

    從本地檔案系統中將資料匯入到Hive表的過程中,其實是先將資料臨時複製到HDFS的一個目錄下(典型的情況是複製到上傳使用者的HDFS的目錄下,比如/根目錄下),然後在將資料從那個臨時目錄下移動(注意,這裡說的是移動,不是複製)到對應的資料目錄裡面。既然如此,那麼Hive肯定支援將資料直接從HDFS上的一個目錄移動到相應Hive表的資料目錄下,假設有這個檔案/add.txt,具體的操作如下:

[[email protected] apache-hive-1.2.1-bin]# ls

add.txt  bin  book.txt  conf  examples  hcatalog  lib  LICENSE  NOTICE  README.txt  RELEASE_NOTES.txt  scripts  wyp.txt

[[email protected] apache-hive-1.2.1-bin]# vim add.txt

 [[email protected] apache-hive-1.2.1-bin]# hdfs dfs -put add.txt /

[[email protected] apache-hive-1.2.1-bin]# hdfs dfs -ls /

Found 4 items-rw-r--r--   3 root supergroup         67 2017-06-11 11:34 /add.txt

-rw-r--r--   3 root supergroup       3719 2017-06-10 12:11 /kms.sh

drwx-wx-wx   - root supergroup          0 2017-06-10 22:06 /tmp

drwxr-xr-x   - root supergroup          0 2017-06-10 22:27 /user

[[email protected] apache-hive-1.2.1-bin]# hdfs dfs -cat /add.txt

4 wyp 

25 131888888888885 test 30 138888888888886 zs 34 899314121

[[email protected] apache-hive-1.2.1-bin]#

上面是需要插入資料的內容,這個檔案時存放在HDFS上/add.txt裡面的(和一中提到的不同,一中提到的檔案是存放在本地檔案系統上,並且在load資料的時候加上了關鍵字local),我們可以同通過下面的命令將這個檔案裡面的內容匯入到Hive表中,具體操作如下:

hive> select * from wyp;

OK1    wyp

25    131888888888882    test    30    138888888888883    zs    34    899314121

Time taken: 0.086 seconds, Fetched: 3 row(s)

hive> load data inpath '/add.txt' into table wyp;

Loading data to table default.wypTable default.wyp stats: [numFiles=2, totalSize=134]OKTime taken: 0.283 seconds

hive> select * from wyp;

OK4    wyp

25    131888888888885    test

30    138888888888886    zs

34    8993141211    wyp

25    131888888888882    test

30    138888888888883    zs

34    899314121

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

hive> 

從上面的執行結果我們可以看到,資料的確匯入到wyp表中了!請注意 load data inpath '/add.txt' into table wyp; 裡面沒有local這個單詞,這個是和一中的區別。    

 

三、從別的表中查詢出相應的資料並匯入到Hive表中
假設Hive中有test表,其建表語句如下所示:

hive> create table test(
    > id int, name string
    > ,tel string)
    > partitioned by
    > (age int)
    > ROW FORMAT DELIMITED
    > FIELDS TERMINATED BY '\t'
    > STORED AS TEXTFILE;
OK
Time taken: 0.261 seconds
大體和wyp表的建表語句類似,只不過test表裡面用age作為了分割槽欄位。對於分割槽,這裡在做解釋一下:
分割槽:在Hive中,表的每一個分割槽對應表下的相應目錄,所有分割槽的資料都是儲存在對應的目錄中。比如wyp表有dt和city兩個分割槽,則對應dt=20131218,city=BJ對應表的目錄為/user/hive/warehouse/dt=20131218/city=BJ,所有屬於這個分割槽的資料都存放在這個目錄中。

下面語句就是將wyp表中的查詢結果並插入到test表中:
hive> insert into table test
    > partition (age='25')
    > select id, name, tel
    > from wyp;

#####################################################################
           這裡輸出了一堆Mapreduce任務資訊,這裡省略
#####################################################################
Total MapReduce CPU Time Spent: 1 seconds 310 msec
OK
Time taken: 19.125 seconds
hive> select * from test;
OK
5       wyp1    131212121212    25
6       wyp2    134535353535    25
7       wyp3    132453535353    25
8       wyp4    154243434355    25
1       wyp     13188888888888  25
2       test    13888888888888  25
3       zs      899314121       25
Time taken: 0.126 seconds, Fetched: 7 row(s)
這裡做一下說明:我們知道我們傳統資料塊的形式insert into table values(欄位1,欄位2),這種形式hive是不支援的。

通過上面的輸出,我們可以看到從wyp表中查詢出來的東西已經成功插入到test表中去了!如果目標表(test)中不存在分割槽欄位,可以去掉partition (age=’25′)語句。當然,我們也可以在select語句裡面通過使用分割槽值來動態指明分割槽:
hive> set hive.exec.dynamic.partition.mode=nonstrict;
hive> insert into table test
    > partition (age)
    > select id, name,
    > tel, age
    > from wyp;

#####################################################################
           這裡輸出了一堆Mapreduce任務資訊,這裡省略
#####################################################################
Total MapReduce CPU Time Spent: 1 seconds 510 msec
OK
Time taken: 17.712 seconds
hive> select * from test;
OK
5       wyp1    131212121212    23
6       wyp2    134535353535    24
7       wyp3    132453535353    25
1       wyp     13188888888888  25
8       wyp4    154243434355    26
2       test    13888888888888  30
3       zs      899314121       34
Time taken: 0.399 seconds, Fetched: 7 row(s)
這種方法叫做動態分割槽插入,但是Hive中預設是關閉的,所以在使用前需要先把hive.exec.dynamic.partition.mode設定為nonstrict。當然,Hive也支援insert overwrite方式來插入資料,從字面我們就可以看出,overwrite是覆蓋的意思,是的,執行完這條語句的時候,相應資料目錄下的資料將會被覆蓋!而insert into則不會,注意兩者之間的區別。例子如下:

hive> insert overwrite table test
    > PARTITION (age)
    > select id, name, tel, age
    > from wyp;

更可喜的是,Hive還支援多表插入,什麼意思呢?在Hive中,我們可以把insert語句倒過來,把from放在最前面,它的執行效果和放在後面是一樣的,如下:
hive> show create table test3;
OK
CREATE  TABLE test3(
  id int,
  name string)
Time taken: 0.277 seconds, Fetched: 18 row(s)
hive> from wyp
    > insert into table test
    > partition(age)
    > select id, name, tel, age
    > insert into table test3
    > select id, name
    > where age>25;

hive> select * from test3;
OK
8       wyp4
2       test
3       zs
Time taken: 4.308 seconds, Fetched: 3 row(s)
可以在同一個查詢中使用多個insert子句,這樣的好處是我們只需要掃描一遍源表就可以生成多個不相交的輸出。這個很酷吧!

 

四、在建立表的時候通過從別的表中查詢出相應的記錄並插入到所建立的表中
在實際情況中,表的輸出結果可能太多,不適於顯示在控制檯上,這時候,將Hive的查詢輸出結果直接存在一個新的表中是非常方便的,我們稱這種情況為CTAS(create table .. as select)如下:

hive> create table test4
    > as
    > select id, name, tel
    > from wyp;

hive> select * from test4;
OK
5       wyp1    131212121212
6       wyp2    134535353535
7       wyp3    132453535353
8       wyp4    154243434355
1       wyp     13188888888888
2       test    13888888888888
3       zs      899314121
Time taken: 0.089 seconds, Fetched: 7 row(s)
資料就插入到test4表中去了,CTAS操作是原子的,因此如果select查詢由於某種原因而失敗,新表是不會建立的!

Java遠端呼叫hive

  使用java遠端連線hive,在這個過程中需要先啟動:hiveServer2.   (注意:org.apache.hive.jdbc.HiveDriver依賴的jar包是:hive-jdbc-1.2.1.jar)

package hive;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class HiveCreateDb {

    /*
     * hiverserver 版本使用此驅動 private static String driverName =
     * "org.apache.hadoop.hive.jdbc.HiveDriver";
     */
    /*
     * hiverserver2 版本使用此驅動
     */
    private static String driverName = "org.apache.hive.jdbc.HiveDriver";

    public static void main(String[] args) throws Exception {

        Class.forName(driverName);

        /* hiverserver 版本jdbc url格式,主要體現在jdbc:hive:// */
        // Connection con =
        // DriverManager.getConnection("jdbc:hive://hadoop1:10000/default", "",
        // "");

        /* hiverserver2 版本jdbc url格式,主要體現在jdbc:hive2:// */
        Connection con = DriverManager.getConnection("jdbc:hive2://hadoop1:10000/default", "", "");
        Statement stmt = con.createStatement();

        // 下面的這一句如果在沒有userdb資料庫的情況下,可以放開。
        // stmt.executeQuery("CREATE DATABASE userdb");

        // 引數設定測試
        // boolean resHivePropertyTest = stmt
        // .execute("SET tez.runtime.io.sort.mb = 128");

        boolean resHivePropertyTest = stmt.execute("set hive.execution.engine=tez");
        System.out.println(resHivePropertyTest);

        stmt.execute("USE userdb");

        String tableName = "testHiveDriverTable";
        try {
            stmt.executeQuery("drop table " + tableName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        ResultSet res;
        try {
            res = stmt.executeQuery("create table " + tableName + " (key int, value string)");
        } catch (Exception e) {
            e.printStackTrace();
        }

        // show tables
        String sql = "show tables '" + tableName + "'";
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        if (res.next()) {
            System.out.println(res.getString(1));
        }

        // //describe table
        sql = "describe " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1) + "\t" + res.getString(2));
        }

        // load data into table
        // NOTE: filepath has to be local to the hive server
        // NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per
        // line
        String filepath = "/tmp/a.txt";
        sql = "load data local inpath '" + filepath + "' into table " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        // select * query
        sql = "select * from " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
        }

        // regular hive query
        sql = "select count(1) from " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1));
        }

        stmt.close();
        con.close();
    }

}

--------------------- 
轉載:
原文:https://blog.csdn.net/tototuzuoquan/article/details/73008228