1. 程式人生 > >Hive基本shell操作

Hive基本shell操作

1>
java客戶端操作hive需要啟動hive遠端服務:hiveserver2
https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2
$HIVE_HOME/bin/hive --service hiveserver2

2>參考:beeline shell
Hiveserver2 支援一個新的命令列Shell為Beeline,它是基於SQLLine CLI的JDBC客戶端。
Beeline支援嵌入模式(embedded mode)和遠端模式(remote mode)。在嵌入式模式下,
執行嵌入式的Hive(類似下面的Hive CLI),而遠端模式可以通過Thrift連線到獨立的HiveServer2程序上.
進入beeline命令列如下:
     1. $HIVE_HOME/bin/hive --service hiveserver2
     2.
     修改hadoop 配置檔案 etc/hadoop/core-site.xml,加入如下配置項
      <property>
      <name>hadoop.proxyuser.root.hosts</name>  ----root 換成自己環境中的使用者
      <value>*<value>
      </property>
      <property>
      <name>hadoop.proxyuser.root.groups</name>
      <value>*</value>
       </property>
     3.  $HIVE_HOME/bin/beeline

[[email protected] bin]# beeline
Beeline version 2.3.3 by Apache Hive
beeline>  !connect jdbc:hive2://127.0.0.1:10000
Connecting to jdbc:hive2://127.0.0.1:10000
Enter username for jdbc:hive2://127.0.0.1:10000: root
Enter password for jdbc:hive2://127.0.0.1:10000: ********
Connected to: Apache Hive (version 2.3.3)
Driver: Hive JDBC (version 2.3.3)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://127.0.0.1:10000> show databases;
+----------------+
| database_name  |
+----------------+
| default        |          
| yoyo2          |
+----------------+
3 rows selected (25.382 seconds)
0: jdbc:hive2://127.0.0.1:10000>

3>
進入hive cli模式操作hive:
$HIVE_HOME/bin/hive
或者
hive --service cli 也可以進入cli模式
hive --help檢視hive的可選引數
hive -S 靜默模式不輸出mapre過程
開啟debug模式:
hive -hiveconf hive.root.logger=DEBUG,console

hive 命令主要分為以下幾類:
       進入與退出hive互動:hive/quit/exit
       引數設定:set/reset
       資原始檔管理:add/list/delete
       執行shell命令:!作業系統命令  
       hdfs檔案操作命令: dfs -ls /dfs -cat
       執行外部檔案:如source file
       hiveQL:DDL/DML語句等

引數設定:set/reset(這裡修改只對該會話生效,如要永久生效需要修改hive-site.xml檔案)

       set;列出所有引數,
       set map使用tab鍵 和 linux 一樣
        hive -e "set;"|grep task
        hive> set mapreduce.job.reduces; ---檢視原始值
                  mapreduce.job.reduces=-1
        hive> set mapreduce.job.reduces=10; ---修改為10
        hive> set mapreduce.job.reduces;  ---檢視修改成功
                  mapreduce.job.reduces=10

        hive> reset mapreduce.job.reduces;---重置引數
        hive> set mapreduce.job.reduces;  ----參看重置成功
        mapreduce.job.reduces=-1

        hive> set hive.cli.print.current.db=true;---顯示當前的資料庫
        hive (default)> 
        hive> set hive.fetch.task.conversion; ---簡單查詢不需要轉換成mapr作業
                  hive.fetch.task.conversion=more
     
        hive -e "set;" |grep map ---檢視包含map的引數

執行shell命令:!命令  例如:!pwd
        hive (default)> !pwd;  ---輸出就是在linux上執行pwd的結果一樣
        /root/Desktop

hdfs檔案操作命令: dfs -ls /dfs -cat
        dfs -ls -R /user;

執行外部檔案:如source file
        source my.sql;mysql裡面就是select 語句如:select * from table1;

hiveQL語句

    show functions; ---檢視內建函式
    select current_timestamp();---使用函式;

也可以自定義函式:
需要繼承org.apache.hadoop.hive.ql.UDF ,需要實現evaluate函式支援過載
1.先開發一個簡單的Java類
import org.apache.hadoop.hive.ql.exec.UDF;
public final class nadd extends UDF {
public Integer evaluate(Integer a, Integer b) {
if (null == a || null == b) {
return null;
} return a + b;
}

2.新增jar包
     hive >add jar /home/lan/jar/nadd.jar;
3.建立臨時函式與開發好的class關聯起來 
     hive >CREATE TEMPORARY FUNCTION myadd  AS 'demo.udf.nadd';
4.使用自定義函式  
     hive >SELECT myadd(num1, num2) FROM t2;
5.銷燬臨時函式:
     hive >DROP TEMPORARY FUNCTION myadd;
DDL語句:
hive的資料型別:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-NumericTypes
複雜的資料型別例子:
   array型別:
   create table tt(id int,  name string,    grades  array<map<string,float>>  );
   表資料為:  1,  tom,  [<'chinese',90>,   <'english',96>,    <'music',79>]

   struct型別:
   create table tt(id int,   info struct<name:tring,age:int,sex:string>);
   表資料為: 1, {'tom', 13, 'F' }

建立內部表:
create table t1 ( id  int,name string,gender string) ---建立的是內部表
row format delimited fields terminated by ','        ---表字段以逗號分隔存放在檔案中
location '/input'                                    ----指定表存放位置,
                                                         預設是放在hdfs的 /user/hive/warehouse/目錄下的
partitioned by (gender string)                       ----指明為分割槽表,在hdfs的/user/hive/warehouse/t1會為分割槽生成不同目錄
clustered by(id) into 3 buckets;                     ----指明為桶表,Hive裡的分桶=MapReduce中的分割槽,而Hive中的分割槽只是將資料分到了不同的                                                         資料夾

建立外部表:只是建立和hdfs上的檔案的連結關係,drop table並不能把hdfs上的檔案刪除
create external table t1 ( id  int,name string,gender string)
location '/input'; ---與hdfs上的/input下面的檔案建立連結關係

建立表的時候同時匯入資料: 也可以使用 load
create table t2 
row format delimited fields terminated by ',' 
as select * from t1;

修改表結構:
alter table t1 add columns(score int);
DML語句:
hive是一個高延時用於海量資料分析的資料倉庫,它不支援單條資料插入,新版本有支援單條記錄的修改,
只是限制頗多隻是針對 tables that support ACID如下:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Update

批量匯入資料:
---從本地/hive/1.txt匯入資料到表t1中的gender='M'分割槽中,如果是hdfs上檔案則不用加local引數
load data local inpath '/hive/1.txt' overwrite into table t1 partition (gender='M');
insert into t1 partition (gender='M') select * from t2 where gender='M';

查詢語句:大多與mysql還是類似的:
select * from t1 where name='tom';
explain select * from t1 where name='tom'; 輸出結果是從下往上讀

4>使用sqooq匯入mysql資料到hive中:

bin/sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/testdb \
--username root2 \
--password password2 \
--query 'select * from t2 where age>12 and $CONDITIONS LIMIT 20' \
--num-mappers 1 \
--target-dir '/sqooq/t2' \
--hive-tables t2