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