在啟動 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.查詢,,
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2MDO3MzM1YTMwETMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
基本查詢:
算術運算
常用函數: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( ) : 指定 分析函數工作的 資料視窗大小,并且這個大小會随着行的變化而變化。
跟在聚合函數後面,開窗,開出部分資料集, 但在不傳參時是對整個的每條資料進行開窗計算。
就是 在處理 每條資料時,在進行 函數計算時,需要 找出特定的一些資料來用于計算,
排名函數:Rank( )
rank() 1 1 3 4
dense_rank() 1 1 2 3
此處的 partition 相當于 group ,這個是 名稱的特定。