使用注意點:
1、讀取hbase,設置prefixFilter過濾器時候,必須使用setStartRow(或者直接使用setRowPrefixFilter過濾器),否則每次scan會遍歷hbase全量數據,而不是hbase的分區數據。
2、scala的函數式編程,兩個變量組合操作時候,需要注意有些操作要用括號包起來,否則會出錯。
3、對hive靜態分區(static partition)使用insert或load加載數據時,要明確指定partition(分區名1=分區值, 分區名2=分區值)。
4、flatMap是在map基礎上,對“列表的列表”拉平爲“列表”。
5、使用maven管理依賴包時候,使用-0參數禁止每次package時重新download包。
6、注意scala中的to和until的區別,前者是右閉,後者是右開。
7、scala使用命令行參數,命令行中的第一個參數就是args(0)
8、Java中的byte[]轉爲Scala中的sting:new Sting()
9、hive訪問的幾種訪問:hue訪問、hive命令行訪問、beeline命令行訪問、hive api訪問(本質也是beeline訪問)。
10、hive數據表的字段名限制:字段名稱中可用包含關鍵字、$和_,但需要用“·”(鍵盤上的左上方引號)包圍即可,但字段名不能包含點號。
使用命令:
1、訪問hive:
beeline -u jdbc:hive2://ip地址:10000/default -n 用戶名 -p 用戶密碼
2、hive加載靜態分區數據:
insert into table 數據表1 partition(分區字段1='test', 分區字段2='test') select * from 數據表2;
load data local inpath '本地文件path' overwrite into table 數據表1;
3、hive表使用壓縮編碼:
SET hive.exec.compress.output=true;
SET mapred.output.compress=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
4、hive表使用Json存儲數據(數據文件中的JSON字符串不能跨行):
row format SERDE 'org.openx.data.jsonserde.JsonSerDe'
相關設置:
(1)放到Hadoop的lib目錄下
(2)將相應json的jar添加到hive環境($HIVE_HOME/lib/ )中:
ADD JAR /opt/cloudera/parcels/CDH/lib/hive/lib/json-serde-1.3.8-jar-with-dependencies.jar;
5、hadoop集羣的節點名稱修改之後,使用hive時顯示hdfs目錄不一致問題
使用hive自帶的metatool修改:
metatool -updateLocation <new-location> <old-location>
6、新增hive表結構:
alter table 數據表名稱add columns(字段名稱 字段類型);
7、load或insert時候,區分into和overwrite區別:
into:不覆蓋舊數據,append新數據
overwrite:使用新數據覆蓋舊數據
8、修改linux的環境變量
/etc/profile是系統級別的,可以使用用戶級別的環境變量配置文件:~/.bashrc
source ~/.bashrc立即生效
9、通過Java的Calendar包獲取時間和日期:
(1)Calendar.HOUR_OF_DAY是24小時制度,而Calendar.HOUR是12制度
(2)Calendar.MONTH下標從0開始,而Calendar.DAY_OF_MONTH和Calendar.HOUR_OF_DAY的下標從1開始。
Hive相關知識點
Hive數據表中可存儲複雜數據類型,比如數組、字典等。
字段名稱 array<string>,
字段名稱 map<string,array<int>>)
使用時候可以使用[]下標獲取(類似python中的字典用法)-- 設置Hive對Json解析時,對異常數據忽略,讀物爲null。
ALTER TABLE 數據表 SET SERDEPROPERTIES("ignore.malformed.json"="true");--設置爲array[int/string等]之後,遇單元素則單元素數組。
-- 數據表存在保留字時,可以使用數據表字段和Json的key之間的映射做轉換。
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES("mapping.字段名稱"="JSON字符串中的key名稱")
hive的常見命令:
show tables like '****'; -- 模糊查詢
desc
show partitions
select table_coulm from table_name where partition_name = '分區字段值';-- 導入數據文件到數據表
LOAD DATA LOCAL INPATH '數據文件' OVERWRITE into table 數據表;-- 數據表數據導出問文件
insert overwrite local directory '數據文件的path' select 字段列表 from 數據表;
-- 自定義udf函數
step1: 繼承UDF類,重寫evaluate方法
step2: 打成jar包,hive執行add jar /***/***.jar;
step3: create temporary function 函數名稱 as 'jar中類路徑'
-- hive shell中kill
hadoop job -kill job_id
alter table 數據表名稱 drop partition(dt='分區值');
ALTER TABLE 數據表名稱old RENAME TO 數據表名稱new;CREATE TABLE 數據表名稱new LIKE 數據表名稱new;
-- 不使用mr引擎
set hive.fetch.task.conversion=more;mapjoin的使用場合:
1、關聯操作中有一張表非常小 (大表數據傾斜)
2、不等值的鏈接操作
select /*+ mapjoin(A)*/ f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)Join的操作情況
(1)Common Join(Reduce階段完成join)
-- 包含Map、Shuffle、Reduce
(2)Map Join(Map階段完成join)-- note
(1)shuffle階段需要大量的網絡數據傳輸
(2)where字句有不等的判斷條件時候,進行表關聯會進行笛卡爾積運算。hive0.7版本之前使用hint:/*+ mapjoin(table) */
0.7版本之後只需要設置下面的選項即可。
set hive.auto.convert.join=true;
-- 設置MapJoin開啓關閉的閥值:25M
hive.mapjoin.smalltable.filesize=25000000MapJoin的操作流程(實際就是將小表數據load到各個mapper的內存中):
step1: MR使用DistributedCache.addCacheFile()記錄和拷貝小表文件。
step2: 啓動jon之前,JobTracker提前獲取文件url,將小表文件分發到各個TaskTracker所在磁盤。
step3: Map類的sepup方法調用DistributedCache.getLocalCacheFiles()將文件讀入內存。
--合併MapJoin
set hive.auto.convert.join.noconditionaltask=true;
--n個小表大小的合計
set hive.auto.convert.join.noconditionaltask.size:
set hive.execution.engine=mr;
set hive.execution.engine=spark;
set hive.execution.engine=tez;
Maven相關知識點
1、使用離線模式打包,而且跳過test
1)mvn clean package -o -Dmaven.skip.test=true
2)也可以在pom.xml文件中配置:<offline>true</offline>
2、maven pom文件添加第三方倉庫:
<repositories> <repository> <id>Cloudera</id> <url>https://repository.cloudera.com/content/repositories/releases/</url> </repository> </repositories>
3、本地maven倉庫拷貝到服務器:
step1:拷貝本地~/.m2文件夾到服務器
step2:修改$MAVEN_HOME/conf下的settings.xml,
<localRepository>/usr/local/.m2/repository</localRepository>
基礎知識點
1、Hive中靜態分區表和動態分區表的區別
2、Hive中order by, sort by, distribute by, cluster by的區別
3、Hbase的分區機制