天天看點

hive 基礎

在啟動 yarn叢集時, 需要在 配置為 yarn叢集 resourcemanager 的結點上 來啟動 yarn 的。在yarn-site.xml中配置的。

1.幾個基本操作:

建表:

create table stu(id int,name string) row format delimited fields terminated by ‘\t’;

加載進表: 這個指令是 相當于 hadoop fs -put

load data inpath ‘/demodata/student.txt’ into table stu;

2.配置mysql

hive自帶的derby 隻能一個使用者使用。

安裝mysql : yum安裝的

,配置mysql相關的到hive-site.xml,

1.hive 資料類型

基本資料類型
		常用的有四種: int  ,  bigint  ,  double ,  string 
           

集合資料類型: array , map , struct

類型轉換: 從小的到大的,一般會隐式轉換

顯示的: cast( ‘1.1’ as double)

create table person(

> name string,

> friends array,

> children map<string,int>,

> address structstreet:string,city:string

> )row format delimited

> fields terminated by ‘,’

> collection items terminated by ‘-’

> map keys terminated by ‘:’

> lines terminated by ‘\n’;

2.DDL 資料定義

庫和表 的操作

1.庫操作

建立資料庫:create database 庫名;

create database if not exists庫名;

create database 庫名 location ‘指定路徑’ ; 會沒有庫名在hdfs中

show databases;

show databases like ‘模糊查詢’

檢視資料庫的詳情:desc database 庫名;

切換資料庫: use 庫名;

修改資料庫:資料庫的名 和 位置位址 不可以修改。

alter database 庫名 set dbproperties('屬性名’ = ‘值’);

删除資料庫:

空的資料庫:drop database 庫名;

非空的:drop database 庫名 cascade;

2.表操作

建立表:

create [external] table [if not exists] table_name (字段。。。)

partitioned by (字段。。。) 按字段分區,分的是檔案夾

clustered by (字段。。。) 分桶,分的是 檔案

sorted by () into nums_buckets buckets

row format 指明 解析行的方式

stored as file_format 指定存儲檔案類型。

location hdfs_path

3.管理表(内部表)

删除内部表時,會把 hdfs和mysql 中的資料都删除。

外部表:

删除外部表時,隻删去mysql中的中繼資料,不會删去hdfs中的資料檔案。

建立外部表:

create external table table_name( )

location ‘hdfs_path’ 通常會指定,差別于預設的存放地方,指定一個目錄

表 和 hdfs 上的資料,誰先存在都可以。

外部表會比較安全,不會把原始資料删除。

在 需要臨時表時,可以用内部表。

内部表與外部表轉換:

檢視表的類型:desc formatted 表名;

内部轉外部:alter table table_name set tblproperties (‘EXTERNAL’ = ‘TRUE’); 裡面的需要大寫。

4.分區表

把一個 表裡的資料,根據日期等,分為多個子檔案夾來存放。 使用where可以選擇特定檔案夾來查詢,縮減了需要處理的資料量。

除了按日期的天分區, 還有按 三端來分區,(資料來源管道,app:自己的應用程式,pc:電腦浏覽器,m:移動手機端的頁面,例如微信小程式,手機浏覽器等)

什麼時候 建立分區: 結合業務 經常會用到的分析條件(口徑); where條件經常會用到的,可以按照這個條件來分區。

在建立 分區表時,需要 指明 進行分區的 字段 ,例如; partitioned by (day string)

建立分區的文法:

create table table_name( )

partitioned by (date string)

row format delimited

fields terminated by ‘\t’

在載入資料時,需要 在 語句後面 指明 分區名。 partition(day=‘7’)

載入資料的文法:

insert into table table_name partition(date=‘2019-11-10’)

select * from other_table;

可以定時 任務的形式,hive任務一般是 淩晨執行,進行統計分析,資料清洗轉換昨天的資料。

或者跑全量資料(昨天之前的資料)

也可以設定 錯誤重新開機等。

分區資訊怎麼存放,如何起作用: 是中繼資料資訊,存放在mysql. 有 where 在mysql 中,找到了分區資訊,可以直接去這個區的hdfs位址進行查找。

增加分區: alter table table_name add partition(day=‘8’) partition(day=‘9’); 多個用空格

删除分區: alter table table_name drop partition(day=‘8’), partition(day=‘9’); 多個 用 逗号

檢視分區:show partitions table_name;

建立 二級 分區表: partitioned by (month string,day string)

對于 直接 用 hadoop fs 建立 和 上傳 的 分區目錄和其中的檔案,并沒有在mysql的分區中繼資料中,留下記錄

可以 進行修複: msck repair table table_name; 這些資料以及存在許多時

也可以 直接 添加 這個分區字段來彌補,

也可以 建好目錄後,用 load data 來 加載資料,會自動記錄分區資訊到mysql.

5.修改表

重命名表: alter table table_name rename to new_table_name;

增加 修改 替換 列資訊:

alter table table_name add columns( )

alter table table_name change column column_name new_column_name new_column_type;

alter table table_name replace columns ( ); 把所有的列 換為這裡 設定的 字段名和類型。

清空表: 隻能清空 内部表,不能清空外部表。

truncate table table_name;

3.DML 資料操作

1.load 加載資料

load data [local] inpath ‘/path/data/xxx.txt’ [overwrite] into table table_name;

2.insert 插入資料

insert into table table_name partition(day=‘12’) values (…)

insert overwrite/into table table_name select xxx,yyy from other_table_name; 覆寫/追加 ,二選一

3.建立表時導入資料

create table table_name as select xxx,yyy from other_table_name;

建立表時 ,還可以 指定加載資料的路徑 ,用 locaton

4.将查詢的結果 格式化的 導出到本地 或 hdfs 上:

insert overwrite local directory ‘/path/data/’ row format delimited fields terminated by ‘\t’ select * from table_name;

如果去掉 local ,會導入到hdfs中。

export table table_name to ‘hdfs_path’; 會包含中繼資料和資料。

import 需要用 export 導出的資料。

6.Sqoop 專用的導入導出的工具。 hive hdfs mysql 之間資料的導入導出

7.查詢,,

hive 基礎
基本查詢:
算術運算
常用函數:count(*) ,max()
limit
比較運算符:  
		  有null是比對不上的意思, 為了把兩個null 也比對上,  null <=> null 
where
between  and        :   區間是 [   ]
is null  ;  is not null
in (   ) 
%  _   :  %是0或多個, _ 是必須一個
having:
		與where不同,where 根據表中的行查詢資料,having根據 查詢結果中的行篩選資料。
		having 後面可以使用分組函數,隻用于group by 分組語句;  where後不能寫分組函數。
join:  hive 隻支援等值連接配接 ,  這裡不支援 or
左/右/全  連接配接:
笛卡爾 積:
表的别名  :  會提高點效率
排序:order by   全局排序,隻有一個reducer
	desc: 降序
	asc  預設 升序
distribute by     按某一字段進行分區。 就是 分發到不同的reducer 上進行處理
sort by :  對每個 reducer 内部進行排序,    可以 用  set  mapreduce.job.reduces  = 3;  一般與distribute 連用放在其後用。
當 distribute 和 sort 兩個用的字段相同時,可以用 cluster by 一個來代替,但其隻能升序。

①order by 全排序,最終會使用一個Reducer生成一個有序的檔案,如果輸入的資料太大的話,一個Reducer根本應付不過來;
②sort by ,會啟用多個Reducer進行分區排序(對資料随機分區),并生成多個檔案,檔案内部是有序的,全局無序;
③distribute by 能夠實作定制化的排序,對表中的某個字段分區,然後進行排序,并形成和Reducer個數相同的輸出檔案,經常和sort by結合起來使用。
④cluster by為distribute by 和 sort by的字段相同的時候的替代


是distribute by隻是分發資料到reduce,而group by将資料分發完以後,後面必須隻能跟count,sum,avg等聚合操作。
           

8.分桶表; 用的較少。 分區是 針對資料檔案的存儲路徑 ,分桶是針對 資料檔案。

create table table_name(id int,name string)

clustered by (id) into 3 buckets

row format delimited

fields determinted by ‘\t’;

會根據 桶的 個數 來開 reduce 的個數。

插入桶中,需要設定一些參數: set hive.enforce.bucketing=true , set mapreduce.job.reduces=-1

導入分桶表 ,需要 用 insert

分桶抽樣查詢: 從 所有桶裡 選取 幾個桶中的資料來查詢或處理

select * from table_name tablesample(bucket x out of y id);

總共有 n 個 桶, y 為n的倍數或因子,來算出抽多少個桶 n/y; x 為從第幾個桶開始抽。

9.查詢函數

空字段用預設值來代替: select nvl(name,“noName”) from table_name; 還可以用其他列的值來代替這個空值

時間類:

格式化時間: date_format

select date_format(‘2019-8-11’, ‘yyyy-MM-dd HH:mm:ss’)

時間跟天數 相加或相減: date_add(‘2019-8-11’,3) date_sub()

兩時間的天數差: datediff(‘2019-8-11’,‘2019-7-21’)

因為 時間函數 隻 處理 2019-8-11 的格式,

字段中字元的替換: regexp_replace(‘2019/8/11’, ‘/’, ‘-’)

10: case when then else end

select

dept_id ,

sum(case sex when '男’ then 1 else 0 end) male_count,

sum(case sex when '女’ then 1 else 0 end) female_count

from emp_dept_sex_table

group by dept_id;

有兩個分支時,也可以把case 替換為 if (布爾表達式,true時的值,false時的值)

11.行轉列,列轉行

合并列: concat(列名 或 字元串,xxx,yyy)

concat_ws(’-’,lie1,lie2,lie3) 拼接的分隔符,隻需再第一個地方聲明

collect_set(lie) , 隻接受基本資料類型的, 把 一列的值 去重彙總。 變成一個數組。

collect_list() 不去重的結合成一列

列轉行: explode( ) 炸開,将一列的 array 或 map 轉換為多行。

測寫: 保持炸開後跟原來表的字段保持關聯。。。lateral view explode( ) 表别名 as 列别名

select movie , category_name

from movie_info lateral view explode(category) table_temp_name as category_name;

例如: 有 姓名,星座,血型

把 星座,血型 姓名1 | 姓名2 | 姓名3 | 。。。 統計出來。

一層一層的寫:

select

人的類型,

concat_ws(’ | ’ ,collect_set(名字))

from

(select

concat (星座,’,’, 血型) 人的類型,

名字

from

原始表) tmp_table

group by 人的類型;

12.視窗函數

over( ) : 指定 分析函數工作的 資料視窗大小,并且這個大小會随着行的變化而變化。

跟在聚合函數後面,開窗,開出部分資料集, 但在不傳參時是對整個的每條資料進行開窗計算。

就是 在處理 每條資料時,在進行 函數計算時,需要 找出特定的一些資料來用于計算,

hive 基礎

排名函數:Rank( )

hive 基礎

rank() 1 1 3 4

dense_rank() 1 1 2 3

此處的 partition 相當于 group ,這個是 名稱的特定。

hive 基礎
hive 基礎

檢視某人花費總額

hive 基礎
hive 基礎

檢視某人的花費:

hive 基礎
hive 基礎

檢視上次購買時間:

hive 基礎
hive 基礎

求 前20%時間的 資料

hive 基礎
hive 基礎

繼續閱讀