日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hive Shell

發布時間:2024/8/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hive Shell 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

hive是否執行mr

創建數據庫指定目錄

刪除數據庫

?顯示表信息/表結構

查看表示內部表還是外部表?

拷貝一張已經存在的表的表模式(而無需拷貝數據)

復制一張表(包括數據)

?hive-cli 顯示當前所在數據庫

執行命令不進入hive交互模式

hive關聯hbase表

創建外部表

查詢數據保存到linux系統

創建內部表

創建parquet格式snappy壓縮表

外部執行

清空表中所有行數據

導入數據

1.將文件放入表目錄下

2.導入本地文件直接導入表中

3.導入hdfs上數據到表中

4.從別的表中查詢插入相應的表

5.在創建表的時候通過從別的表中查詢出相應的記錄并插入到所創建的表中

UDF

Hive執行引擎設置

Hive指定yarn隊列

多表插入

Hive手動創建目錄導入數據,表刷新partition



hive是否執行mr

簡單的查詢,就是只是select,不帶count,sum,group by這樣的,都不走map/reduce,直接讀取hdfs文件進行filter過濾。這樣做的好處就是不新開mr任務,執行效率要提高不少,但是不好的地方就是用戶界面不友好,有時候數據量大還是要等很長時間,但是又沒有任何返回。 改這個很簡單,在hive-site.xml里面有個配置參數叫 hive.fetch.task.conversion 將這個參數設置為more,簡單查詢就不走map/reduce了,設置為minimal,就任何簡單select都會走map/reduce

創建數據庫指定目錄

hive> CREATE DATABASE financials> LOCATION '/my/preferred/directory'> COMMENT 'Holds all financial tables'

刪除數據庫

hive> DROP DATABASE IF EXISTS financialsIF EXISTS子句是可選的,如果加了這個子句,就可以避免因數據庫finanacials不存在而拋出警告信息默認情況下,Hive是不允許用戶刪除一個包含有表的數據庫的。用戶要么先刪除數據庫中的表,然后再刪除數據庫;要么在刪除命令的最后面加上關鍵字CASCADE,這樣可以使Hive自行先刪除數據庫中的表:hive> DROP DATABASE IF EXISTS financials CASCADE

?顯示表信息/表結構

hive > DESCRIBE FORMATTED mydb.tableNameFORMATTED 詳細表結構

查看表示內部表還是外部表?

hive> DESCRIBE extended crawler_hive2; 內部表: tableType:MANAGED_TABLE 外部表:ableType:EXTERNAL_TABLE

拷貝一張已經存在的表的表模式(而無需拷貝數據)

CREATE TABLE IF NOT EXISTS mydb.employees2 LIKE mydb.employees LOCATION 'xxxx/xxx/xxx'

復制一張表(包括數據)

create table t_copy as select * from t_temp;

?

?hive-cli 顯示當前所在數據庫

hive> set hive.cli.print.current.db=true; hive (ods_database)>取消顯示 set hive.cli.print.current.db=false;

執行命令不進入hive交互模式

hive -e "SQL" 執行單條語句 hive -f /home/root/insert.sql 執行sql文件,適合多條語句

hive關聯hbase表

hive集成hbase:

hive 0.13版本 hbase1.2.5版本無法創建hive創建內部表關聯,提示找不到方法,hive更新到2.1.1版本就可以了

  • hive創建外部表關聯(可以關聯hbase已有的表)
CREATE EXTERNAL TABLE hive_high_keyword(key string, keyword string, adCode string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping"=":key,fn:keyword,fn:adCode" )TBLPROPERTIES("hbase.table.name" = "crawl:high_keyword");
  • hive創建內部表關聯(只能關聯hbase中沒有的表,刪除hive表后hbase表也會刪除,并且通過hive創建hbase的內部表,存儲數據仍然存在hbse中)
CREATE TABLE biz0728(key string, name string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( "hbase.columns.mapping"=":key,fn:name" ) TBLPROPERTIES("hbase.table.name" = "biz0728");

創建外部表

create EXTERNAL TABLE u_info (usrid STRING,age STRING,sex STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n';

查詢數據保存到linux系統

insert overwrite local directory '/home/xxx/xxx' select * from tableName;

?


創建內部表

create TABLE u_info (usrid STRING,age STRING,sex STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n';

創建parquet格式snappy壓縮表

CREATE EXTERNAL TABLE IF NOT EXISTS tableName(xxx string)
partitioned by
(pt_xvc string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
STORED AS PARQUET TBLPROPERTIES('parquet.compression'='SNAPPY');

?


外部執行

hive -f xxx.sql


清空表中所有行數據

truncate table tablename;

導入數據

1.將文件放入表目錄下

  • 表創建時會指定列分隔符(默認'\t')和行分隔符(默認'\n')
  • 將數據以指定形式放入,hive在hdfs存儲目錄下

測試導入數據如下(a.txt里內容):

user1 27 1 user2 28 1 user3 29 0 user4 30 1 user5 31 0 user6 32 1 user7 33 1 user8 34 0 我 是 測試 外 部 表
  • 步驟:
    • 用上面創建表命令創建一個內部或者外部表
    • 將a.txt里的內容導入到hdfs該表的目錄下
    • select * from u_info;即可查詢到數據
  • 如果有兩個txt,查詢時會合并到一起

2.導入本地文件直接導入表中

測試導入數據a.txt

load data local inpath 'a.txt' into table u_info;
  • a.txt,文件路徑默認是用戶的根目錄,如root用戶,讀取目錄為/home/root/a.txt
  • 推薦寫絕對路徑
load data local inpath '/home/root/a.txt' into table u_info;
  • 在hive中可以直接查看hdfs上的數據,使用命令:
dfs -ls /user/hive/warehouse/xxx ;

3.導入hdfs上數據到表中

測試導入數據a.txt

load data inpath '/a.txt' into table u_info;
  • 與2中的區別是少了一個 local

4.從別的表中查詢插入相應的表

  • 創建表 test 并且以age進行分區
create table testc( id int, name string ,tel string,sdf string) partitioned by (age int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
  • 查詢另一個表的數據并且插入到test表
insert into table test partition (age='25') select id, name, tel from wyp;

這里做一下說明: 我們知道我們傳統數據塊的形式insert into table values(字段1,字段2),這種形式hive是不支持的。

  • 我們也可以在select語句里面通過使用分區值來動態指明分區:
set hive.exec.dynamic.partition.mode=nonstrict; insert into table test partition (age) select id, name, tel, age from wyp;// partition (age),指定創建表時候的列 // partition跟select 中查詢的列名無關,對應select查詢最后一個列為test表中的age做partition(describe tablename 可以查看partition在哪個位置)

這種方法叫做動態分區插入,但是Hive中默認是關閉的,所以在使用前需要先把hive.exec.dynamic.partition.mode設置為nonstrict

5.在創建表的時候通過從別的表中查詢出相應的記錄并插入到所創建的表中

  • 在實際情況中,表的輸出結果可能太多,不適于顯示在控制臺上,這時候,將Hive的查詢輸出結果直接存在一個新的表中是非常方便的,我們稱這種情況為CTAS(create table .. as select)如下:
create table test4 as select id, name, tel from wyp;

UDF

  • UDFClass
public class Uppercase extends UDF { //參數列表可以使用多個參數public Text evaluate(Text s1){String retsult=s1.toString().toUpperCase();return new Text(retsult);} }

maven引用

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.1</version></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.2.1</version></dependency>
  • 在hive交互界面輸入
//添加自己寫入的jar包到hive中 add jar /home/root/udf.jar; // 將自己寫的類創建為函數,函數名為mytest create temporary function mytest as 'com.xxx.hive.udf.Uppercase'; //查看所有可用函數,會發現自己剛剛添加的函數 show functions; //使用udf函數查詢 select mytest(u_info.age) from u_info;
  • 使用函數查詢后結果
704512 BJ-華龍達 北京市華龍達商貿公司 2457600 NNZQD 南寧市百花谷文化傳播有限公司 21889024 LYYZC@Y.COM ztc 7979008 GX303YY200XLWW014 中國人民解放軍第三0三醫院
  • 不使用函數結果
704512 bj-華龍達 北京市華龍達商貿公司 2457600 nnzqd 南寧市百花谷文化傳播有限公司 21889024 lyyzc@y.com ztc 7979008 gx303yy200xlww014 中國人民解放軍第三0三醫院
  • 使用hive -i 參數在進入hive時自動初始化
$ cat hive_init add jar /home/root/udf.jar; create temporary function mytest as 'com.xxx.hive.udf.Uppercase'; $ hive -i hive_init //進入hive交互界面就可直接使用函數了

和前兩者相比,第三種方式直接將用戶的自定義函數作為注冊為內置函數,未來使用起來非常簡單,但這種方式也非常危險,一旦出錯,將是災難性的,因此,建議如果不是特別通用,并且固化下來的函數,還是使用前兩種方式比較靠譜。

Hive執行引擎設置

set hive.execution.engine=mr;

Hive指定yarn隊列

set mapred.job.queue.name=queue3;

多表插入

FROM tableName1 INSERT OVERWRITE TABLE tableName2SELECT column1,colum2 GROUP BY year INSERT OVERWRITE TABLE tableName3SELECT column1,count(1)WHERE column2 = 100
  • CTAS(CREATE TABLE... AS SELECT) 把查詢到的結果創建一個新表保存起來,原子性操作,查詢失敗表不會被創建
CREATE TABLE tableName AS SELECT column1,column2 FROM tableName2

Hive手動創建目錄導入數據,表刷新partition

alter table crawler_other_article_hive add partition(created_date=201801) location 'hdfs://xxx:8020/user/hive/warehouse/ods_crawler.db/crawler_other_article_hive/created_date=201801';刪除表分區 ALTER TABLE testc DROP PARTITION (pt_date=20181212)

?

總結

以上是生活随笔為你收集整理的Hive Shell的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。