Hive基本語法和使用

Hive 語法

建表語句

第一種常用新建原始表

create [EXTERNAL] table vv_stat_fact
(
userid  string,
stat_date string,
tryvv int,
sucvv int,
ptime float
)
 PARTITIONED BY ( 非必選;創建分區表
  dt string)
clustered by (userid) into 3000 buckets // 非必選;分桶子
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'  // 必選;指定列之間的分隔符 
STORED AS rcfile   // 非必選;指定文件的讀取格式,默認textfile格式
location '/testdata/'; //非必選;指定文件在hdfs上的存儲路徑,如果已經有文件,會自動加載 ,默認在hive的warehouse下

第二種關聯建表

create table dianxin_as_S AS select * from dianxin_503 limit 10;

注意新建表不允許是外部表。select後面表需要是已經存在的表,建表同時會加載數據。會啓動mapreduce任務去讀取源表數據寫入新表。

CREATE EXTERNAL TABLE IF NOT EXISTS dianxin_like LIKE dianxin_503;

第三種,創建分區表
分區表指的是在創建表時指定分區空間,實際上就是在hdfs上表的目錄下再創建子目錄。在使用數據時如果指定了需要訪問的分區名稱,則只會讀取相應的分區,避免全表掃描,提高查詢效率。

CREATE TABLE page_view(viewTime INT, ip STRING ) PARTITIONED BY (dt STRING, country STRING) ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'

加載數據

  • 使用load data 命令
    從hdfs導入數據,路徑可以是目錄,會將目錄下所有文件導入,但是文件格式必須一致。
    load data inpath ‘/test/’ into table dianxin_test;

  • 從本地文件系統導入
    load data local inpath ‘/test/’ into table dianxin_test;

  • 表對錶加載:
    create table IF NOT EXISTS dianxin_test2 as select * from dianxin_test
    insert [overwrite] into table dianxin_test2 select * from dianxin_test;

注意:
1,如果建表語句沒有指定存儲路徑,不管是外部表還是內部表,存儲路徑都是會默認在hive/warehouse/xx.db/表名的目錄下。加載的數據也會移動到該表的存儲目錄下。注意是移動,移動,移動。不是複製
2,刪除外部表,文件不會刪除,對應目錄也不會刪除

Hive的DDL語句

  • 創建數據庫 create database xxxxx;
  • 查看數據庫 show databases;刪除數據庫 drop database tmp;
  • 強制刪除數據庫:drop database tmp cascade;
  • 查看錶:SHOW TABLES;
  • 查看錶的元信息:
    desc test_table;
    describe extended test_table;
    describe formatted test_table;
  • 查看建表語句:show create table table_XXX
  • 重命名錶:
    alter table test_table rename to new_table;
  • 修改列數據類型:alter table lv_test change column colxx string;
  • 增加、刪除分區:
    alter table test_table add partition (pt=xxxx)
    alter table test_table drop if exists partition(…);

Hive的DML語句

在這裏插入圖片描述

Hive函數

常見的函數

  • if函數 if(,,)
  • case when 函數:case when 。。。end
  • 日期函數:to_date…
  • 字符串函數:concat,concat_ws
  • 聚合函數:sum,count。。。
  • null值判斷:is null ,is not null

高級函數
窗口函數(開窗函數):用戶分組中開窗
row_number() 等
select * from (select name,date_time,row_number() over(partition by name order by cost desc) as rn from window_t)a where rn=1;
一般用於分組中求 TopN

Hive-自定義函數UDF

  • UDF函數可以直接應用於select語句,對查詢結構做格式化處理後,再輸出內容。
  • 編寫UDF函數的時候需要注意一下幾點:
    • 自定義UDF需要繼承org.apache.hadoop.hive.ql.exec.UDF
    • 需要evaluate函數。
  • 步驟
    • 把程序打包放到目標機器上去;
    • 進入hive客戶端,添加jar包: add jar /usr/local/testdata/hive_UP.jar;
    • 創建臨時函數:hive>CREATE TEMPORARY FUNCTION f_up as ‘hive_demo.hive_udf’;
  • 查詢HQL語句:
    select f_up(line) from wc_test;
    銷燬臨時函數:hive> DROP TEMPORARY FUNCTION f_up;
    注:UDF只能實現一進一出的操作,如果需要實現多進一出,則需要實現UDAF

Hive-jdbc的連接操作

  • 首先開啓 metastore:hive --service metastore
  • 開啓 hiveserver2:hive --service hiveserver2
  • 添加maven依賴
 <dependency>
             <groupId>org.apache.hive</groupId>
             <artifactId>hive-jdbc</artifactId>
             <version>1.2.1/version>
 </dependency>

Java代碼

package hive;

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

public class hive_jdbc {
	public static void main(String[] args) throws Exception {
		Class.forName("org.apache.hive.jdbc.HiveDriver");
		Connection con = DriverManager.getConnection("jdbc:hive2://master:10000/zhangsan");
		Statement cs = con.createStatement();
		//查詢sql,query
		ResultSet rs = cs.executeQuery("select * from zhangsan.air_id");
		//通常用於ddl操作
		//cs.execute("create table testxx");
		while(rs.next()) {
			String word = rs.getString(1);
			String count = rs.getString(2);
			System.out.println(word + ", " + count);
		}
		rs.close();
		cs.close();
		con.close();
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章