scala讀寫hbase和hive經驗彙總

使用注意點:

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=25000000

MapJoin的操作流程(實際就是將小表數據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的分區機制

 

 

 

 

 

 

 

 

 

 

 

 

 

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