30.域的含義
域英文叫DOMAIN——域(Domain)是Windows網(wǎng)絡(luò)中獨(dú)立運(yùn)行的單位欺旧,域之間相互訪問則需要建立信任關(guān)系(即Trust Relation)紊服。信任關(guān)系是連接在域與域之間的橋梁简软。當(dāng)一個(gè)域與其他域建立了信任關(guān)系后叁幢,2個(gè)域之間不但可以按需要相互進(jìn)行管理,還可以跨網(wǎng)分配文件和打印機(jī)等設(shè)備資源巧娱,使不同的域之間實(shí)現(xiàn)網(wǎng)絡(luò)資源的共享與管理闺金,以及相互通信和數(shù)據(jù)傳輸逾滥。
域既是 Windows 網(wǎng)絡(luò)操作系統(tǒng)的邏輯組織單元,也是Internet的邏輯組織單元败匹,在 Windows 網(wǎng)絡(luò)操作系統(tǒng)中寨昙,域是安全邊界。域管理員只能管理域的內(nèi)部掀亩,除非其他的域顯式地賦予他管理權(quán)限舔哪,他才能夠訪問或者管理其他的域,每個(gè)域都有自己的安全策略槽棍,以及它與其他域的安全信任關(guān)系捉蚤。
31.SQL CHECK 約束
CHECK 約束用于限制列中的值的范圍。
如果對單個(gè)列定義 CHECK 約束炼七,那么該列只允許特定的值缆巧。
如果對一個(gè)表定義 CHECK 約束,那么此約束會在特定的列中對值進(jìn)行限制豌拙。
1.下面的 SQL 在 "Persons" 表創(chuàng)建時(shí)為 "Id_P" 列創(chuàng)建 CHECK 約束陕悬。CHECK 約束規(guī)定 "Id_P" 列必須只包含大于 0 的整數(shù)。
CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
2.如果需要命名 CHECK 約束按傅,以及為多個(gè)列定義 CHECK 約束捉超,請使用下面的 SQL 語法:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)
SQL CHECK Constraint on ALTER TABLE
3.如果在表已存在的情況下為 "Id_P" 列創(chuàng)建 CHECK 約束,請使用下面的 SQL:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
4.如果需要命名 CHECK 約束逞敷,以及為多個(gè)列定義 CHECK 約束狂秦,請使用下面的 SQL 語法:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
5.如需撤銷 CHECK 約束,請使用下面的 SQL:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
32.Lpad函數(shù)
lpad(字段名,填充長度,填充的字符)
是用來在指定字段左側(cè)填充字符推捐,
比如select lpad('3',2,0) from dual; 就是在 3 這個(gè)基礎(chǔ)上左側(cè)補(bǔ) 0,一共是2位侧啼, 結(jié)果為 03
33.如何使主鍵的值自動(dòng)加1并在前面補(bǔ)0
select LPAD(id+1,14,'0') 記錄編號 from tetdmis
34.order by牛柒,decode對字符列進(jìn)行特定的排序
大家還可以在Order by中使用Decode堪簿。
例:表table_subject,有subject_name列皮壁。要求按照:語椭更、數(shù)、外的順序進(jìn)行排序蛾魄。這時(shí)虑瀑,就可以非常輕松的使用Decode完成要求了。
select * from table_subject order by decode(subject_name, '語文', 1, '數(shù)學(xué)', 2, , '外語',3)
35.decode取最小值
select?decode(sign(變量1-變量2),-1,變量1,變量2) from dual; --取較小值
sign()函數(shù)根據(jù)某個(gè)值是0滴须、正數(shù)還是負(fù)數(shù)舌狗,分別返回0、1扔水、-1
36.decode 查詢某班男生和女生的數(shù)量分別是多少
select decode(性別痛侍,男,1魔市,0)主届,decode(性別,女待德,1君丁,0) from 表
37.利用decode實(shí)現(xiàn)表或者試圖的行列轉(zhuǎn)換
SELECT?
? ? ? ?SUM(DECODE(ENAME,'SMITH',SAL,0)) ?SMITH,
? ? ? ?SUM(DECODE(ENAME,'ALLEN',SAL,0)) ?ALLEN,
? ? ? ?SUM(DECODE(ENAME,'WARD',SAL,0)) ? WARD,
? ? ? ?SUM(DECODE(ENAME,'JONES',SAL,0)) ?JONES,
? ? ? ?SUM(DECODE(ENAME,'MARTIN',SAL,0)) MARTIN FROM EMP
輸出結(jié)果如下:
SMITH ?ALLEN ?WARD ? JONES ?MARTIN
800 ?1600 ? 1250 ? ? 2975 ? 1250
38.使用decode函數(shù)來使用表達(dá)式來搜索字符串
SELECT?ENAME,SAL,DECODE(INSTR(ENAME, 'S'),0,'不含有s','含有s') ASINFO ROM EMP
輸出結(jié)果:
SMITH 800 ? 含有s
ALLEN 1600 ? 不含有s
39.iif函數(shù)的簡單使用
IIf([發(fā)貨日期]<Date(),"已發(fā)貨",IIf([發(fā)貨日期]=Date(),"今天發(fā)貨","未發(fā)貨"))
40.Exists函數(shù)的使用
如果exiists中不包含里外關(guān)聯(lián)條件,如:
select * from emp where exists (select * from dept where dname like '%A%')
則其表命只要括號內(nèi)子查詢語句返回結(jié)果不為空說明where條件成立就會執(zhí)行主sql語句将宪,全部輸出
如果exiists中還包含里外關(guān)聯(lián)條件谈截,如:
select * from emp where exists (select * from dept where dname like '%A%' and deptno = emp.deptno)
則其表明只有滿足括號中條件的結(jié)果才會被輸出
41.not exists函數(shù)的使用
not exists和exists相反,子查詢語句結(jié)果為空涧偷,則表示where條件成立簸喂,執(zhí)行sql語句
如果not exiists中不包含里外關(guān)聯(lián)條件燎潮,如:
select * from emp where not exists (select * from dept where dname like '%A%')
則其表命只要括號內(nèi)子查詢語句返回結(jié)果為空說明where條件成立就會執(zhí)行主sql語句喻鳄,全部輸出
如果not exiists中還包含里外關(guān)聯(lián)條件,如:
select * from emp where exists (select * from dept where dname like '%A%' and deptno = emp.deptno)
則其表明只有滿足括號中條件取反的結(jié)果才會被輸出(包括沒有相關(guān)數(shù)據(jù)的)
補(bǔ)充: “<>”與“确封!=”類似
補(bǔ)充:exiists與not exiists均與子查詢結(jié)果無關(guān)除呵,子查詢結(jié)果只起到了一個(gè)判定的作用,里面的where條件才是關(guān)鍵
補(bǔ)充:exists可以改造為where的格式爪喘,例如:
select * from emp where exists (select * from dept where dname like '%A%' and deptno = emp.deptno)
可以改造為:
select * from emp e ,dept d where d.dname like '%A%' and d.deptno = e.deptno
42.Extract()函數(shù)
截取時(shí)間颜曾,如:
Extract(YEAR FROM SYSDATE)
43.SQL UNION 操作符
UNION 操作符用于合并兩個(gè)或多個(gè) SELECT 語句的結(jié)果集。
請注意秉剑,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列泛豪。列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每條 SELECT 語句中的列的順序必須相同诡曙。
SQL UNION 語法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注釋:默認(rèn)地臀叙,UNION 操作符選取不同的值。如果允許重復(fù)的值价卤,請使用 UNION ALL劝萤。
SQL UNION ALL 語法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 結(jié)果集中的列名總是等于 UNION 中第一個(gè) SELECT 語句中的列名慎璧。
44.各種關(guān)聯(lián)查詢的場景選擇
?商品表:存放商品信息
?圖片表:存放圖片
商品表里有4個(gè)商品床嫌,其中兩個(gè)商品沒有圖片
查詢所有的商品的所有信息
正確的做法是列出所有的商品,如果圖片不存在就顯示為 NULL胸私。這時(shí)候就可以使用左連接——LEFT JOIN
補(bǔ)充:
1.inner join相當(dāng)于用where條件來關(guān)聯(lián)
2.left join是指包含左邊表的全部記錄(而不是全部字段厌处,具體輸出什么字段是自己指定的)
3.查詢所有商品信息,則商品表在左邊盖文;查詢所有圖片對應(yīng)的商品嘱蛋,則圖片表在左邊
4.當(dāng)多表聯(lián)查使用left join的時(shí)候,只保證含有最左側(cè)表中的全部記錄即可五续,之后的若干表順序無所謂(但是若是其中出現(xiàn)了依次right join洒敏,則以其右側(cè)表記錄為準(zhǔn);inner join與outer join同理)
45.catalog與schema
按照SQL標(biāo)準(zhǔn)的解釋疙驾,在SQL環(huán)境下Catalog和Schema都屬于抽象概念凶伙,主要用來解決命名沖突問題。
從概念上說它碎,一個(gè)數(shù)據(jù)庫系統(tǒng)包含多個(gè)Catalog函荣,每個(gè)Catalog又包含多個(gè)Schema,而每個(gè)Schema又包含多個(gè)數(shù)據(jù)庫對象(表扳肛、視圖傻挂、序列等),反過來講一個(gè)數(shù)據(jù)庫對象必然屬于一個(gè)Schema挖息,而該Schema又必然屬于一個(gè)Catalog金拒,這樣我們就可以得到該數(shù)據(jù)庫對象的完全限定名稱從而解決命名沖突的問題了
catalog是由一個(gè)數(shù)據(jù)庫實(shí)例的元數(shù)據(jù)組成的
schema是對一個(gè)數(shù)據(jù)庫的結(jié)構(gòu)描述
46.Spark內(nèi)存分配的優(yōu)化
問題原因:查看到用于緩存RDD的內(nèi)存有很大一部分沒有利用上,因此我們可以對Spark內(nèi)部的內(nèi)存分配進(jìn)行一下調(diào)整, 調(diào)高用于shuffle的內(nèi)存, 調(diào)低用于緩存RDD的內(nèi)存具體做法如下:減少配置項(xiàng)” spark.storage.memoryFraction”的比例數(shù),增大配置項(xiàng)” spark.shuffle.memoryFraction”的比例數(shù), 從RDD緩存區(qū)中拿一部分內(nèi)存出來用于shuffle的計(jì)算
47.substring()內(nèi)只有一個(gè)參數(shù)的用法
指的是從該位置以后開始截取
48.在Hive 中如何使用符合數(shù)據(jù)結(jié)構(gòu) ?maps套腹,array绪抛,structs
1. Array的使用?
create table ?person(name string,work_locations array<string>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ',';
數(shù)據(jù):
biansutao?beijing,shanghai,tianjin,hangzhou
linan?changchu,chengdu,wuhan
2. Map 的使用?
create table score(name string, score map<string,int>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';
數(shù)據(jù):
biansutao?'數(shù)學(xué)':80,'語文':89,'英語':95
jobs?'語文':60,'數(shù)學(xué)':80,'英語':99
3 Struct 的使用
CREATE TABLE test(id int,course struct<course:string,score:int>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ',';
數(shù)據(jù):
1?english,80
2?math,89
3?chinese,95
49.對于以下數(shù)據(jù)樣例,如何進(jìn)行數(shù)據(jù)清洗:
fQShwYqGqsw?????lonelygirl15???736?People & Blogs????133?151763??3.01???????666?765?fQShwYqGqsw?????LfAaY1p_2Is?5LELNIVyMqo??????vW6ZpqXjCE4??????vPUAf43vc-Q???????ZllfQZCc2_M?it2d7LaU_TA?KGRx8TgZEeU????aQWdqI1vd6o??????kzwa8NBlUeo???????X3ctuFCCF5k??????Ble9N2kDiGc???????R24FONE2CDs???IAY5q60CmYY?????mUd0hcEnHiU???????6OUcp6UJ2bA?????dv0Y_uoHrLc???????8YoxhsUMlgA???????h59nXANN-oo??????113yn3sv0eo
考慮點(diǎn):在video.txt中电禀,視頻可以有多個(gè)所屬分類,每個(gè)所屬分類用&符號分割,并且分割的兩邊有空格字符,多個(gè)相關(guān)視頻又用“tab”進(jìn)行分割幢码。為了分析數(shù)據(jù)時(shí)方便對存在多個(gè)子元素的數(shù)據(jù)進(jìn)行操作,我們首先進(jìn)行數(shù)據(jù)重組清洗操作。
具體做法:將所有的類別用“&”分割,同時(shí)去掉兩邊空格,多個(gè)相關(guān)視頻 id 也使用“&”進(jìn)行分割(如果用“tab”則與字段無法區(qū)分了)
注意事項(xiàng):
1.這里的數(shù)據(jù)清洗不涉及reduce操作尖飞,所以只用map即可症副,視頻的相關(guān)視頻id可以沒有店雅,但是比如評論數(shù)必須有值,沒有評論即為0瓦糕,所以如果一條數(shù)據(jù)的字段缺少底洗,也是臟數(shù)據(jù)腋么,是要被清洗的
2.數(shù)據(jù)清洗時(shí)先拿單行數(shù)據(jù)測試
50.oracel新建函數(shù)包括存儲過程與函數(shù)咕娄,其二者有何區(qū)別
oracle中存儲過程和函數(shù)的區(qū)別如下:
1.存儲過程實(shí)現(xiàn)的功能要復(fù)雜一點(diǎn),而函數(shù)的實(shí)現(xiàn)的功能針對性比較強(qiáng)珊擂。
2.對于存儲過程來說可以返回參數(shù)圣勒,而函數(shù)只能返回值或者表對象。
3.存儲過程一般是作為一個(gè)獨(dú)立的部分來執(zhí)行摧扇,而函數(shù)可以作為查詢語句的一個(gè)部分來調(diào)用圣贸,由于函數(shù)可以返回一個(gè)表對象,因此它可以在查詢語句中位于FROM關(guān)鍵字的后面扛稽。
4.當(dāng)存儲過程和函數(shù)被執(zhí)行的時(shí)候吁峻,SQL Manager會到procedure cache中去取相應(yīng)的查詢語句,如果在procedure cache里沒有相應(yīng)的查詢語句在张,SQL Manager就會對存儲過程和函數(shù)進(jìn)行編譯用含。
5.返回值的區(qū)別,函數(shù)有1個(gè)返回值,而存儲過程是通過參數(shù)返回的,可以有多個(gè)或者沒有
6.調(diào)用的區(qū)別,函數(shù)可以在查詢語句中直接調(diào)用,而存儲過程必須單獨(dú)調(diào)用. 函數(shù)一般情況下是用來計(jì)算并返回一個(gè)計(jì)算結(jié)果而存儲過程一般是用來完成特定的數(shù)據(jù)操作(比如修改、插入數(shù)據(jù)庫表或執(zhí)行某些DDL語句等等) 參數(shù)的返回情況來看: 如果返回多個(gè)參數(shù)值最好使用存儲過程帮匾,如果只有一個(gè)返回值的話可以使用函數(shù)啄骇; oracle函數(shù)和存儲過程最大的區(qū)別就在于,函數(shù)必須帶上一個(gè)return返回值瘟斜,后面跟的是返回值的類型缸夹,而存儲過程可以不帶任何返回值。
51.oracel中的declare的用法
Declare用于定義變量螺句,并為其賦值虽惭,在sql查詢窗口執(zhí)行即可,具體實(shí)例如下:
SQL> declare?
empno emp.empno%TYPE; //聲明的時(shí)候%TYPE前面一定要加上表的中列蛇尚,具體執(zhí)行流程為:首先它到emp表中去查找empno列 %TYPE返回其數(shù)據(jù)的數(shù)據(jù)類型(用于不清楚變量的數(shù)據(jù)類型的情況芽唇,若是已知數(shù)據(jù)類型,則可以直接寫上)
????? ename emp.ename%TYPE;?
????? job?? emp.job%TYPE;?
???? begin?
????? select empno,ename,job into empno,ename,job from emp?? where empno='7369';?
????? dbms_output.put_line(empno||'/'||ename||'/'||job);?
???? end;?
注意:
1.使用select.....into....from語句只能返回單行數(shù)據(jù)佣蓉,如果返回多行披摄,則會出錯(cuò)。
2. dbms_output.put_line()可以輸出括號內(nèi)變量的值
3. 直接賦值要用 := 勇凭,并且賦值只能在begin…end中進(jìn)行疚膊,否則會報(bào)錯(cuò)
4.適用以下條件和循環(huán):
if … then…else…end if;
和
for … in …(1..20指經(jīng)歷20次循環(huán)) loop …(循環(huán)體)? end loop;
5. oracle 數(shù)組類型,沒有現(xiàn)成的類型虾标,但是可以自己隨意定義寓盗,很方便。
Oracle 數(shù)組可以分為定長數(shù)組和可變長的數(shù)組兩類。以下主要是一維數(shù)組介紹:
定長數(shù)組:
/*定長字符數(shù)組傀蚌,數(shù)組大小為10*/
declare
type v_arr is varray(10) of varchar2(30);
my_arr v_arr;
begin
my_arr:=v_arr('1','2','3');
???????for i in 1..my_arr.count
???????loop
??????????????dbms_output_line(my_arr(i));
???????end loop;
end;???????
變長數(shù)組:
/*可變長字符數(shù)組基显,元素大小30,索引標(biāo)號integer類型自增長*/
declare?
type v_table is table of varchar2(30) index by binary_integer;??
--類型可以是前面的類型定義善炫,index by binary_integer子句代表以符號整數(shù)為索引撩幽,??
--這樣訪問表類型變量中的數(shù)據(jù)方法就是“表變量名(索引符號整數(shù))”。??
my_table v_table;??
begin?
????? for i in 1..20??
???? loop??
????????? my_table(i):=i;??
????????? dbms_output.put_line(my_table(i));??
????? end loop;??
end
注意:雖然可以自定義數(shù)組類型的變量箩艺,但是僅限于用在本次會話中窜醉,因此無法在創(chuàng)建表的時(shí)候指定該種數(shù)據(jù)類型
63.Shullfe中默認(rèn)的排序、分區(qū)艺谆、合并如何進(jìn)行
1.shullfe中的排序:默認(rèn)以mapoutkey進(jìn)行排序
2.shullfe中的分區(qū):默認(rèn)分一個(gè)區(qū)
3.shullfe中的合并:默認(rèn)相同的key進(jìn)行合并
64.reduce端分組如何實(shí)現(xiàn):
一般繼承WritableComparator類榨惰,覆寫public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)方法
65.reduce端排序如何實(shí)現(xiàn):
一般繼承WritableComparator類,覆寫public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)方法
66.12.hive中使用orc的壓縮方式建表如何導(dǎo)入數(shù)據(jù)
orc的壓縮方式要想向表中導(dǎo)入數(shù)據(jù)需要使用子查詢的方式導(dǎo)入静汤,即把從另一張表中查詢到的數(shù)據(jù)插入orc壓縮格式的表匯中琅催,所以這里需要四張表,兩張textfile類型的表user和video虫给,兩張orc類型的表user_orc和video_orc
67.Hive中order by藤抡,sort by,distribute by狰右,cluster by的區(qū)別
1.order by
全局排序
2.sort by和distribute by組合使用(效果與order by一樣杰捂,但是使用場景不同)
當(dāng)有多個(gè)reduce時(shí)(可以通過set mapred.reduce.tasks=n來指定reduce的個(gè)數(shù)),sort by僅保證在每個(gè)reduce內(nèi)排序(部分有序)棋蚌,distribute by的作用是控制哪些行放入哪些reduce處理的(并不會排序)嫁佳,因此distribute by經(jīng)常和sort by配合使用:SELECT * FROM year distribute by year sort by year asc,temp desc
3.CLUSTER BY
關(guān)鍵字是DISTRIBUTE BY和SORT BY的簡寫,這兩者可以認(rèn)為對應(yīng)與Hadoop的partition和sort過程谷暮。如果partition和sort的key是不同的蒿往,可以使用DISTRIBUTE BY和SORT BY分別指定(如上面的例子)
注:Distribute by和sort by配合使用的場景
1.Map輸出的文件大小不均。
2.Reduce輸出文件大小不均湿弦。
3.小文件過多瓤漏。
4.文件超大。
補(bǔ)充:hive中create table時(shí)的“clustered by(字段1)sorted by (字段2) into 8 buckets”是什么意思
create table時(shí)的clustered by其實(shí)僅僅是分布颊埃,與Select語句中的cluster by其實(shí)并不一樣蔬充。而是和Select語句中的distribute by相同。所以create table的clustered by sorted by其實(shí)等價(jià)于select的distribute by sort by班利,即:按照字段1分布在8個(gè)buckets(桶)中饥漫,并且在每個(gè)buckets中按照字段2升序排序
68.hive中的buckets
Buckets 對指定列計(jì)算 hash,根據(jù) hash 值切分?jǐn)?shù)據(jù)罗标,目的是為了并行庸队,每一個(gè) Bucket 對應(yīng)一個(gè)文件积蜻。如將 user 列分散至 32 個(gè) bucket,首先對 user 列的值計(jì)算 hash彻消,對應(yīng) hash 值為 0 的 HDFS 目錄為:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00000竿拆;hash 值為 20 的 HDFS 目錄為:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00020?
這段描述是說用了bucket之后的,那為什么要用bucket宾尚,沒說丙笋,本著認(rèn)真負(fù)責(zé)的態(tài)度,我從網(wǎng)上搜索到了Oreilly《Programming.Hive》這本書央勒,然后在里面找到了答案不见,現(xiàn)在發(fā)出來和大家分享一下澳化。
首先回顧一下分區(qū),分區(qū)是切分?jǐn)?shù)據(jù)的一種比較方便的方法,比較常用的就是按照日期來進(jìn)行切分裹驰,bucket(中文意思就是籃子废麻,可以放雞蛋,哈哈)其實(shí)也是一種切分?jǐn)?shù)據(jù)的方法列林。
假設(shè)我們有一張日志表瑞你,我們需要按照日期和用戶id來分區(qū),目的是為了加快查詢誰哪天干了什么希痴,如下:
CREATE TABLE weblog (url STRING, source_ip STRING)
> PARTITIONED BY (dt STRING, user_id INT);
但是這里面用user_id去切分的話者甲,就會產(chǎn)生很多很多的分區(qū)了,這些分區(qū)可大可小砌创,這個(gè)數(shù)量是文件系統(tǒng)所不能承受的虏缸。
在這種情況下,我們既想加快查詢速度嫩实,又避免出現(xiàn)如此多的小分區(qū)刽辙,籃子(bucket)就出現(xiàn)了。
具體的用法是:
CREATE TABLE weblog (user_id INT, url STRING, source_ip STRING)
> PARTITIONED BY (dt STRING)
> CLUSTERED BY (user_id) INTO 96 BUCKETS;
首先按照日期分區(qū)甲献,分區(qū)結(jié)束之后再按照user_id把日志放在96個(gè)籃子宰缤,這樣同一個(gè)用戶的所有日志都會在同一個(gè)籃子里面,并且一個(gè)籃子里面有好多用戶的日志晃洒。
然后我們在插入數(shù)據(jù)的時(shí)候就要注意了慨灭,我們一定要設(shè)置hive.enforce.bucketing為true。
hive> SET hive.enforce.bucketing = true;
hive> FROM raw_logs
> INSERT OVERWRITE TABLE weblog
> PARTITION (dt='2009-02-25')
> SELECT user_id, url, source_ip WHERE dt='2009-02-25';
到此球及,bucket介紹完畢氧骤!
總結(jié):分區(qū)與分桶的目的都是分布存儲數(shù)據(jù),但是以某些特定字段分區(qū)后會造成分區(qū)大小不一桶略,并且存在大量小分區(qū)语淘,這樣十分影響效率诲宇,因此可以使用分桶表,可以控制桶的個(gè)數(shù)惶翻,并且使數(shù)據(jù)均勻分布在桶中姑蓝!
69.Hive 自定義函數(shù) UDF UDAF UDTF的區(qū)別
1、UDF:用戶定義(普通)函數(shù)吕粗,只對單行數(shù)值產(chǎn)生作用纺荧;
2、UDAF:User- Defined Aggregation Funcation颅筋;用戶定義聚合函數(shù)宙暇,可對多行數(shù)據(jù)產(chǎn)生作用;等同與SQL中常用的SUM()议泵,AVG()占贫,也是聚合函數(shù);
3先口、UDTF:User-Defined Table-Generating Functions型奥,用戶定義表生成函數(shù),用來解決輸入一行輸出多行碉京;
70.拆解json字段厢汹,將其進(jìn)行行轉(zhuǎn)列,并獲取key為monthSales的數(shù)據(jù):
[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
錯(cuò)誤方法:
select get_json_object(explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')),'$.monthSales') as? sale_info from explode_lateral_view;
會報(bào)錯(cuò):
FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions(即:UDTF 類型的explode函數(shù)不能寫在別的函數(shù)內(nèi))
注:這時(shí)候就需要LATERAL VIEW出場了
正確方法:
select get_json_object(concat('{',sale_info_r,'}'),'$.monthSales') as monthSales from explode_lateral_view?
LATERAL VIEW explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{'))sale_info as sale_info_r;
補(bǔ)充1:將json字段 完全轉(zhuǎn)換成二維表的方式展現(xiàn):
select get_json_object(concat('{',sale_info_1,'}'),'$.source') as source,
? ? ?get_json_object(concat('{',sale_info_1,'}'),'$.monthSales') as monthSales,
? ? ?get_json_object(concat('{',sale_info_1,'}'),'$.userCount') as monthSales,
? ? ?get_json_object(concat('{',sale_info_1,'}'),'$.score') as monthSales
? from explode_lateral_view?
LATERAL VIEW explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{'))sale_info as sale_info_1;
補(bǔ)充2:LATERAL VIEW也可以多重使用
select goods_id2,sale_info,area2
from explode_lateral_view?
LATERAL VIEW explode(split(goods_id,','))goods as goods_id2?
LATERAL VIEW explode(split(area,','))area as area2;
以上結(jié)果為三個(gè)表(explode_lateral_view谐宙、goods烫葬、area)笛卡爾積的結(jié)果
補(bǔ)充3:如果你這么寫,想查兩個(gè)字段:
select explode(split(area,',')) as area,good_id from explode_lateral_view;
會報(bào)錯(cuò):
FAILED: SemanticException 1:40 Only a single expression in the SELECT clause is supported with UDTF's. Error encountered near token 'good_id'(即:使用UDTF的時(shí)候凡蜻,只支持一個(gè)字段)
注:這時(shí)候就需要LATERAL VIEW出場了
71.eclipse打包jar無法連帶打包第三方lib搭综,于是選擇安裝插件fatjar,但是目前高版本的eclipse無法兼容fatjar咽瓷,解決方法如下:
https://www.cnblogs.com/lyh971134228/p/7144981.html
72.sql中any()和all()的使用
分別指任意和全部
73.數(shù)據(jù)庫索引的利弊
索引能讓數(shù)據(jù)庫查詢數(shù)據(jù)的速度上升设凹, 而使寫入數(shù)據(jù)的速度下降,原因很簡單的茅姜, 因?yàn)槠胶鈽溥@個(gè)結(jié)構(gòu)必須一直維持在一個(gè)正確的狀態(tài)闪朱, 增刪改數(shù)據(jù)都會改變平衡樹各節(jié)點(diǎn)中的索引數(shù)據(jù)內(nèi)容,破壞樹結(jié)構(gòu)钻洒, 因此奋姿,在每次數(shù)據(jù)改變時(shí), DBMS必須去重新梳理樹(索引)的結(jié)構(gòu)以確保它的正確素标,這會帶來不小的性能開銷称诗,也就是為什么索引會給查詢以外的操作帶來副作用的原因
74.數(shù)據(jù)庫索引的使用方式
1.單個(gè)字段建立索引
create index index_birthday on user_info(birthday);
//查詢生日在1991年11月1日出生用戶的用戶名
select user_name from user_info where birthday = '1991-11-1'
這句SQL語句的執(zhí)行過程如下:
首先,通過非聚集索引index_birthday查找birthday等于1991-11-1的所有記錄的主鍵ID值
然后头遭,通過得到的主鍵ID值執(zhí)行聚集索引查找寓免,找到主鍵ID值對就的真實(shí)數(shù)據(jù)(數(shù)據(jù)行)存儲的位置
最后癣诱, 從得到的真實(shí)數(shù)據(jù)中取得user_name字段的值返回, 也就是取得最終的結(jié)果
2.多個(gè)字段建立組合索引
create index index_birthday_and_user_name on user_info(birthday, user_name);
這句SQL語句的執(zhí)行過程就會變?yōu)椋?/p>
通過非聚集索引index_birthday_and_user_name查找birthday等于1991-11-1的葉節(jié)點(diǎn)的內(nèi)容袜香,然而葉節(jié)點(diǎn)中除了有user_name表主鍵ID的值以外撕予, user_name字段的值也在里面, 因此不需要通過主鍵ID值的查找數(shù)據(jù)行的真實(shí)所在蜈首,直接取得葉節(jié)點(diǎn)中user_name的值返回即可实抡。 通過這種覆蓋索引直接查找的方式, 可以省略不使用覆蓋索引查找的后面兩個(gè)步驟欢策, 大大的提高了查詢性能
117.flume中event事件頭作用
可以添加一些數(shù)據(jù)正文之外的額外的數(shù)據(jù)
118.Map與mapPartitions方法的區(qū)別
map是對rdd中的每一個(gè)元素進(jìn)行操作吆寨,而mapPartitions(foreachPartition)則是對rdd中的每個(gè)分區(qū)的迭代器進(jìn)行操作。如果在map過程中需要頻繁創(chuàng)建額外的對象(例如將rdd中的數(shù)據(jù)通過jdbc寫入數(shù)據(jù)庫,map需要為每個(gè)元素創(chuàng)建一個(gè)鏈接而mapPartition為每個(gè)partition創(chuàng)建一個(gè)鏈接),則mapPartitions效率比map高的多踩寇。
mapPartitions傳入的參數(shù)是一個(gè)迭代器啄清,里面包含rdd里的所有元素,返回結(jié)果也要是一個(gè)迭代器
119.Map與flatMap方法的區(qū)別
Flatmap與map類似姑荷,區(qū)別是原RDD中的元素經(jīng)map處理后只能生成一個(gè)元素盒延,而原RDD中的元素經(jīng)flatmap處理后可生成多個(gè)元素來構(gòu)建新RDD
例如:
sc.makeRDD(List("asf asx wwq laaa","saa wqe we ffff sss")).flatmap(_.split(" "))
可以生成含有9個(gè)元素的rdd
120.Map方法與reduce方法的作用
map的主要作用就是替換。reduce的主要作用就是計(jì)算鼠冕。
reduce可以將所有元素從頭開始每兩個(gè)一組進(jìn)行運(yùn)算,最后返回一個(gè)結(jié)果元素