今天幫一同學(xué)導(dǎo)入一個(gè)excel數(shù)據(jù),我把excel保存為txt格式,然后建表導(dǎo)入,失敗!分隔符格式不匹配,無(wú)法導(dǎo)入?。。。≡趺纯磧蛇叾际荺t,怎么不匹配呢?
做為程序員,最不怕的就是失敗,因?yàn)槲覀冇幸活w勇敢的心!再來(lái)!又特么失敗。。。
想了好久,看看了看我的表格式,我犯了一個(gè)好低級(jí)的錯(cuò)誤:
hive表的存儲(chǔ)格式設(shè)置為了orcfile!!!
眾所周知:orcfile為壓縮格式,可以節(jié)約大量存儲(chǔ)空間,但orc還有個(gè)特點(diǎn)就是不能直接load數(shù)據(jù)!要想load數(shù)據(jù),我們要建一個(gè)存儲(chǔ)格式為textfile的中間表,然后再把數(shù)據(jù)抽取過(guò)去。因?yàn)檫@個(gè)錯(cuò)誤太簡(jiǎn)單,網(wǎng)上有相關(guān)科普,因此很少有把它當(dāng)錯(cuò)誤寫(xiě)出來(lái)。遇到問(wèn)題的朋友們可能要走些彎路,我來(lái)補(bǔ)個(gè)漏~~~~~~
舉個(gè)栗子:
1.首先,導(dǎo)出excel表格為txt格式,(這個(gè)過(guò)程不再贅述,網(wǎng)上教程一大把)。
123,小明,666,1990-09-23 12:00:18
256,小伙,555,1989-10-06 03:57:32
142,小蘭,444,1992-07-04 05:05:45
2.在hive中創(chuàng)建表模型:
CREATE TABLE IF NOT EXISTS STUDENTS
(
ID INT COMMENT'學(xué)生',
SNAME STRING COMMENT '姓名',
SCORE INT COMMENT '得分',
STIME STRING COMMENT '考試時(shí)間'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS ORCFILE;
3.創(chuàng)建臨時(shí)表(中間表):
CREATE TABLE IF NOT EXISTS STUDENTS_TMP
(
ID INT COMMENT'學(xué)生',
SNAME STRING COMMENT '姓名',
SCORE INT COMMENT '得分',
STIME STRING COMMENT '考試時(shí)間'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
與目標(biāo)表只有名稱(chēng)和存儲(chǔ)格式不同,其他都相同。
4.load 數(shù)據(jù)到臨時(shí)表:
load data local inpath '/export/data/1.txt' into table students_tmp;
5.將數(shù)據(jù)導(dǎo)入目標(biāo)表:
insert overwrite table students select * from students_tmp;
6.然后查看表數(shù)據(jù),大功造成:
hive > select * from students;
OK
123 小明 666 1990-09-23 12:00:18
256 小伙 555 1989-10-06 03:57:32
142 小蘭 444 1992-07-04 05:05:45
Time taken: 0.26 seconds, Fetched: 3 row(s)
其他存儲(chǔ)格式如 SEQUENCEFILE、PARQUET 等,也要選存儲(chǔ)為textfile格式,然后抽入目標(biāo)表。
一定要按照導(dǎo)出格式的分隔符建表,不然load數(shù)據(jù)必然出錯(cuò)或全是null;
excel導(dǎo)出格式:
格式 分隔符 中文名稱(chēng)
text \t 制表符
csv , 逗號(hào)
7.還要注意一點(diǎn)是我們從excel導(dǎo)出的文件格式是gb2312 (無(wú)論是txt還是csv都是這個(gè)格式,都需要轉(zhuǎn)碼),我們需要把它轉(zhuǎn)成utf-8才能Load。
所以在load之前,我們一般會(huì)采取兩種辦法:
1. 在文本編輯器中進(jìn)行轉(zhuǎn)碼,帶不帶bom關(guān)系不大,然后上傳;
2.在文件所在本地目錄下執(zhí)行以下命令轉(zhuǎn)碼:
piconv -f gb2312 -t UTF-8 1.txt > 2.txt
注意,在本地目錄下命令轉(zhuǎn)碼會(huì)改變文件名,因?yàn)榇嗣顣?huì)把所文件寫(xiě)入到另一個(gè)文件,并清空原文件內(nèi)容,如果我們不改名,文件內(nèi)容會(huì)完全丟失。所以,我們Load的時(shí)候一定要選擇修改后的文件名哦。
示例:
轉(zhuǎn)碼前數(shù)據(jù):
hive> select * from students;
OK
112 �� 35 2017/8/19 15:30
113 ���� 45
114 ³�� 55 2017/8/21 15:30
115 ���� NULL
116 ������ 75 2017/8/23 15:30
117 ������ 85 2017/8/24 15:30
118 �˽� NULL 2017/8/25 15:30
119 ������ 90
120 СѾ NULL 2017/8/27 15:30
121 ���� 80 2017/8/28 15:30
122 ��߸ 75
123 ��«�� 70 2017/8/30 15:30
124 ���� NULL 2017/8/31 15:30
125 �繤 NULL
126 �嶠 NULL 2017/9/2 15:30
127 ˾�� 50 2017/9/3 15:30
128 ������ 58 2017/9/4 15:30
129 ���� 66 2017/9/5 15:30
Time taken: 0.134 seconds, Fetched: 18 row(s)
去所在目錄下轉(zhuǎn)碼,再Load
piconv -f gb2312 -t UTF-8 2.csv > 3.csv
# 在hive中選擇正確的文件Load:
hive> load data local inpath '/export/data/3.csv' into table students;
結(jié)果:
hive> select * from students;
OK
112 小寶 35 2017/8/19 15:30
113 王明 45
114 魯班 55 2017/8/21 15:30
115 苗苗 NULL
116 少林寺 75 2017/8/23 15:30
117 體育界 85 2017/8/24 15:30
118 八戒 NULL 2017/8/25 15:30
119 周芷若 90
120 小丫 NULL 2017/8/27 15:30
121 海寶 80 2017/8/28 15:30
122 哪吒 75
123 葫蘆娃 70 2017/8/30 15:30
124 丹楓 NULL 2017/8/31 15:30
125 電工 NULL
126 村長(zhǎng) NULL 2017/9/2 15:30
127 司機(jī) 50 2017/9/3 15:30
128 王世間 58 2017/9/4 15:30
129 松鼠 66 2017/9/5 15:30
Time taken: 0.106 seconds, Fetched: 18 row(s)
補(bǔ)充:hive導(dǎo)入數(shù)據(jù)出現(xiàn)NULL
在把hdfs上數(shù)據(jù)遷移到hive中的表時(shí),若出現(xiàn)數(shù)據(jù)位NULL,是因?yàn)闆](méi)有指定列分隔符。
由于hive默認(rèn)的分隔符是/u0001(Ctrl+A),為了平滑遷移,需要在創(chuàng)建表格時(shí)指定數(shù)據(jù)的分割符號(hào),語(yǔ)法如下:
hive (default)> create external table et (time BIGINT, userid string, content string, urlrank int, urlnum int, url string)
> partitioned by (filenum int)
> row format delimited fields terminated by '\t';
上面創(chuàng)建的是外部表,“導(dǎo)入”數(shù)據(jù)時(shí)可以用load,但若不想進(jìn)行移動(dòng)數(shù)據(jù),就用命令alter來(lái)進(jìn)行指向:
alter table et add partition (filenum=1) location '/input/SogouQueryLog/file1';
注意location后面跟的地址必須是個(gè)目錄,若不是,可以用hdfs fs -mv src dest 進(jìn)行移動(dòng)數(shù)據(jù):
hadoop fs -mv /input/SogouQueryLog/querylog_1 /input/SogouQueryLog/file1
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- 在python中使用pyspark讀寫(xiě)Hive數(shù)據(jù)操作
- 使用Python構(gòu)造hive insert語(yǔ)句說(shuō)明
- python3.6.5基于kerberos認(rèn)證的hive和hdfs連接調(diào)用方式
- python 實(shí)現(xiàn) hive中類(lèi)似 lateral view explode的功能示例
- Python pandas 列轉(zhuǎn)行操作詳解(類(lèi)似hive中explode方法)