新聞中心
在使用Hive進(jìn)行數(shù)據(jù)處理的過程中,常常會(huì)遇到需要加載GBK編碼的數(shù)據(jù)庫的情況。由于Hive默認(rèn)使用的是UTF-8編碼,因此需要一些額外的步驟來進(jìn)行GBK編碼的數(shù)據(jù)庫加載。本文將介紹。

成都做網(wǎng)站、網(wǎng)站建設(shè),成都做網(wǎng)站公司-創(chuàng)新互聯(lián)已向超過千家企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營銷等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。
一、創(chuàng)建GBK編碼的數(shù)據(jù)庫
在Hive中創(chuàng)建一個(gè)GBK編碼的數(shù)據(jù)庫有兩種方法:通過Hive的CLI命令行和通過Hue的Web UI界面。
1. 通過Hive的CLI命令行
步驟如下:
1) 打開Hive的CLI命令行
2) 輸入以下命令創(chuàng)建一個(gè)GBK編碼的數(shù)據(jù)庫:
CREATE DATABASE dbname CHARACTER SET gbk;
其中,dbname為要?jiǎng)?chuàng)建的數(shù)據(jù)庫名稱。
3) 可以使用以下命令查看所有數(shù)據(jù)庫的字符集設(shè)置:
SHOW DATABASES;
2. 通過Hue的Web UI界面
步驟如下:
1) 打開Hue的Web UI界面
2) 在左側(cè)導(dǎo)航欄中選擇“Hive”菜單
3) 在頁面上方的菜單欄選擇“查詢”選項(xiàng)卡
4) 輸入以下命令創(chuàng)建一個(gè)GBK編碼的數(shù)據(jù)庫:
CREATE DATABASE dbname CHARACTER SET gbk;
其中,dbname為要?jiǎng)?chuàng)建的數(shù)據(jù)庫名稱。
5) 可以使用以下命令查看所有數(shù)據(jù)庫的字符集設(shè)置:
SHOW DATABASES;
二、配置Hive支持GBK編碼
在Hive默認(rèn)情況下,使用UTF-8編碼進(jìn)行數(shù)據(jù)處理。如果需要支持GBK編碼,需要進(jìn)行一些額外的配置。
1. 修改Hive配置文件
打開Hive的配置文件hive-site.xml,添加以下配置:
hive.input.format
org.apache.hadoop.hive.ql.io.HiveInputFormat
use the correct input format
hive.default.fileformat
TextFile
default file format
mapred.input.dir.recursive
true
Recursively read files in input directory
mapred.output.compress
false
Do not compress output data
mapred.output.compress.codec
org.apache.hadoop.io.compress.DefaultCodec
Use the default compression codec
io.file.buffer.size
131072
Set file buffer size in bytes
hive.mapred.supports.subdirectories
true
Let input/output dirs be recursively scanned
hive.mapred.supports.label.multiple.inputs
true
Support multiple inputs with different formats for a given job
2. 復(fù)制GBK編碼的字符集庫到Hive的lib目錄
在GBK編碼的系統(tǒng)中,可以通過以下命令復(fù)制GBK編碼的字符集庫到Hive的lib目錄:
cp /usr/share/java/mysql-connector-java-5.1.45.jar /usr/local/hive/lib/
其中,mysql-connector-java-5.1.45.jar為要復(fù)制的字符集庫文件名。
三、使用Hive加載GBK編碼的數(shù)據(jù)
1. 創(chuàng)建Hive表
使用以下命令創(chuàng)建一個(gè)Hive表:
CREATE TABLE test (
id INT,
name STRING
)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.OpenCSVSerde’
WITH SERDEPROPERTIES (
“separatorChar” = “,”,
“quoteChar” = “\'”,
“escapeChar” = “\\”
)
STORED AS TEXTFILE;
其中,test為表名稱。
2. 加載GBK編碼的數(shù)據(jù)
使用以下命令加載GBK編碼的數(shù)據(jù)到Hive表中:
LOAD DATA LOCAL INPATH ‘/path/to/gbk_data.csv’ INTO TABLE test;
其中,/path/to/gbk_data.csv為要加載數(shù)據(jù)的文件路徑。
3. 查看數(shù)據(jù)
可以使用以下命令查詢加載的數(shù)據(jù):
SELECT * FROM test;
四、
本文介紹了如何在Hive中加載GBK編碼的數(shù)據(jù)庫。需要注意的是,在Hive中對GBK編碼的支持需要進(jìn)行一些額外的配置,包括修改Hive配置文件和復(fù)制字符集庫文件到Hive的lib目錄。在加載GBK編碼的數(shù)據(jù)時(shí),需要使用LOAD DATA命令進(jìn)行加載。
相關(guān)問題拓展閱讀:
- windows下怎么用python連接hive數(shù)據(jù)庫
windows下怎么用python連接hive數(shù)據(jù)庫
由于版本的不同,Python 連接 Hive 的方式也就不一樣。
在網(wǎng)上搜索關(guān)鍵字 python hive 的時(shí)候可以找譽(yù)察到一些解決方案。大部分是這彎畢樣的,首先把hive 根目錄埋虛芹下的$HIVE_HOME/lib/py拷貝到 python 的庫中,也就是 site-package 中,或者干脆把新寫的 python 代碼和拷貝的 py 庫放在同一個(gè)目錄下,然后用這個(gè)目錄下提供的 thrift 接口調(diào)用。示例也是非常簡單的。類似這樣:
import sys
from hive_service import ThriftHive
from hive_service.ttypes import HiveServerException
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
def hiveExe(sql):
try:
transport = TSocket.TSocket(‘127.0.0.1’, 10000)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = ThriftHive.Client(protocol)
transport.open()
client.execute(sql)
print “The return value is : ”
print client.fetchAll()
print “…………”
transport.close()
except Thrift.TException, tx:
print ‘%s’ % (tx.message)
if __name__ == ‘__main__’:
hiveExe(“show tables”)
或者是這樣的:
#!/usr/bin/env python
import sys
from hive import ThriftHive
from hive.ttypes import HiveServerException
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
try:
transport = TSocket.TSocket(‘14.18.154.188’, 10000)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = ThriftHive.Client(protocol)
transport.open()
client.execute(“CREATE TABLE r(a STRING, b INT, c DOUBLE)”)
client.execute(“LOAD TABLE LOCAL INPATH ‘/path’ INTO TABLE r”)
client.execute(“SELECT * FROM test1”)
while (1):
row = client.fetchOne()
if (row == None):
break
print rowve
client.execute(“SELECT * FROM test1”)
print client.fetchAll()
transport.close()
except Thrift.TException, tx:
print ‘%s’ % (tx.message)
但是都解決不了問題,從 netstat 中查看可以發(fā)現(xiàn) TCP 連接確實(shí)是建立了,但是不執(zhí)行 hive 指令。也許就是版本的問題。
還是那句話,看各種中文博客不如看官方文檔。
項(xiàng)目中使用的 hive 版本是0.13,此時(shí)此刻官網(wǎng)的最新版本都到了1.2.1了。中間間隔了1.2.0、1.1.0、1.0.0、0.14.0。但是還是參考一下官網(wǎng)的方法試試吧。
首先看官網(wǎng)的 setting up hiveserver2
可以看到啟動(dòng) hiveserver2 可以配置更大最小線程數(shù),綁定的 IP,綁定的端口,還可以設(shè)置認(rèn)證方式。(之前一直不成功正式因?yàn)檫@個(gè)連接方式)然后還給了 python 示例代碼。
import pyhs2
with pyhs2.connect(host=’localhost’,
port=10000,
authMechani=”PLAIN”,
user=’root’,
password=’test’,
database=’default’) as conn:
with conn.cursor() as cur:
#Show databases
print cur.getDatabases()
#Execute query
cur.execute(“select * from table”)
#Return column info from query
print cur.getSchema()
#Fetch table results
for i in cur.fetch():
print i
在拿到這個(gè)代碼的時(shí)候,自以為是的把認(rèn)證信息給去掉了。然后運(yùn)行發(fā)現(xiàn)跟之前博客里介紹的方法結(jié)果一樣,建立了 TCP 連接,但是就是不執(zhí)行,也不報(bào)錯(cuò)。這是幾個(gè)意思?然后無意中嘗試了一下原封不動(dòng)的使用上面的代碼。結(jié)果可以用。唉。。。
首先聲明一下,hive-site.xml中默認(rèn)關(guān)于 hiveserver2的配置我一個(gè)都沒有修改,一直是默認(rèn)配置啟動(dòng) hiveserver2。沒想到的是默認(rèn)配置是有認(rèn)證機(jī)制的。
然后再寫一點(diǎn),在安裝 pyhs2的時(shí)候還是遇到了點(diǎn)問題,其實(shí)還是要看官方文檔的,我只是沒看官方文檔直接用 pip安裝導(dǎo)致了這個(gè)問題。安裝 pyhs2需要確定已經(jīng)安裝了幾個(gè)依賴包。直接看在 github 上的 wiki 吧。哪個(gè)沒安裝就補(bǔ)上哪一個(gè)就好了。
To install pyhs2 on a clean CentOS 6.4 64-bit desktop….
(as root or with sudo)
get ez_setup.py from
python ez_setup.py
easy_install pip
yum install gcc-c++
yum install cyrus-sasl-devel.x86_64
yum install python-devel.x86_64
pip install pyhs
寫了這么多,其實(shí)是在啰嗦自己遇到的問題。下面寫一下如何使用 python
連接 hive。
python 連接 hive 是基于 thrift 完成的。所以需要服務(wù)器端和客戶端的配合才能使用。
在服務(wù)器端需要啟動(dòng) hiveserver2 服務(wù),啟動(dòng)方法有兩種, 第二種方法只是對之一種方法的封裝。
1. $HIVE_HOME/bin/hive –server hiveserver2
2. $HIVE_HOME/bin/hiveserver21212
默認(rèn)情況下就是hiveserver2監(jiān)聽了10000端口。也可以通過修改 hive-site.xml 或者在啟動(dòng)的時(shí)候添加參數(shù)來實(shí)現(xiàn)修改默認(rèn)配置。
另外一方面,在客戶端需要安裝 python 的依賴包 pyhs2。安裝方法在上面也介紹了,基本上就是用 pip install pyhs2,如果安裝不成功,安裝上面提到的依賴包就可以了。
最后運(yùn)行上面的示例代碼就可以了,配置好 IP 地址、端口、數(shù)據(jù)庫、表名稱就可以用了,默認(rèn)情況下認(rèn)證信息不需要修改。
另外補(bǔ)充一點(diǎn) fetch 函數(shù)執(zhí)行速度是比較慢的,會(huì)把所有的查詢結(jié)果返回來??梢钥匆幌?pyhs2 的源碼,查看一下還有哪些函數(shù)可以用。下圖是 Curor 類的可以使用的函數(shù)。
一般 hive 表里的數(shù)據(jù)比較多,還是一條一條的讀比較好,所以選擇是喲功能 fetchone函數(shù)來處理數(shù)據(jù)。fetchone函數(shù)如果讀取成功會(huì)返回列表,否則 None??梢园咽纠a修改一下,把 fetch修改為:
count = 0
while (1):
row = cur.fetchone()
if (row is not None):
count += 1
print count, row
else:
print “it’s over”
關(guān)于hive加載gbk數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開發(fā)老牌服務(wù)商!微信小程序開發(fā),APP開發(fā),網(wǎng)站制作,網(wǎng)站營銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
分享題目:Hive如何加載GBK編碼的數(shù)據(jù)庫 (hive加載gbk數(shù)據(jù)庫)
本文路徑:http://www.dlmjj.cn/article/dpidpdp.html


咨詢
建站咨詢
