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

成都做網(wǎng)站、網(wǎng)站建設,成都做網(wǎng)站公司-創(chuàng)新互聯(lián)已向超過千家企業(yè)提供了,網(wǎng)站設計,網(wǎng)站制作,網(wǎng)絡營銷等服務!設計與技術結合,多年網(wǎng)站推廣經(jīng)驗,合理的價格為您打造企業(yè)品質(zhì)網(wǎng)站。
一、創(chuàng)建GBK編碼的數(shù)據(jù)庫
在Hive中創(chuàng)建一個GBK編碼的數(shù)據(jù)庫有兩種方法:通過Hive的CLI命令行和通過Hue的Web UI界面。
1. 通過Hive的CLI命令行
步驟如下:
1) 打開Hive的CLI命令行
2) 輸入以下命令創(chuàng)建一個GBK編碼的數(shù)據(jù)庫:
CREATE DATABASE dbname CHARACTER SET gbk;
其中,dbname為要創(chuàng)建的數(shù)據(jù)庫名稱。
3) 可以使用以下命令查看所有數(shù)據(jù)庫的字符集設置:
SHOW DATABASES;
2. 通過Hue的Web UI界面
步驟如下:
1) 打開Hue的Web UI界面
2) 在左側導航欄中選擇“Hive”菜單
3) 在頁面上方的菜單欄選擇“查詢”選項卡
4) 輸入以下命令創(chuàng)建一個GBK編碼的數(shù)據(jù)庫:
CREATE DATABASE dbname CHARACTER SET gbk;
其中,dbname為要創(chuàng)建的數(shù)據(jù)庫名稱。
5) 可以使用以下命令查看所有數(shù)據(jù)庫的字符集設置:
SHOW DATABASES;
二、配置Hive支持GBK編碼
在Hive默認情況下,使用UTF-8編碼進行數(shù)據(jù)處理。如果需要支持GBK編碼,需要進行一些額外的配置。
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. 復制GBK編碼的字符集庫到Hive的lib目錄
在GBK編碼的系統(tǒng)中,可以通過以下命令復制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為要復制的字符集庫文件名。
三、使用Hive加載GBK編碼的數(shù)據(jù)
1. 創(chuàng)建Hive表
使用以下命令創(chuàng)建一個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編碼的支持需要進行一些額外的配置,包括修改Hive配置文件和復制字符集庫文件到Hive的lib目錄。在加載GBK編碼的數(shù)據(jù)時,需要使用LOAD DATA命令進行加載。
相關問題拓展閱讀:
- windows下怎么用python連接hive數(shù)據(jù)庫
windows下怎么用python連接hive數(shù)據(jù)庫
由于版本的不同,Python 連接 Hive 的方式也就不一樣。
在網(wǎng)上搜索關鍵字 python hive 的時候可以找譽察到一些解決方案。大部分是這彎畢樣的,首先把hive 根目錄埋虛芹下的$HIVE_HOME/lib/py拷貝到 python 的庫中,也就是 site-package 中,或者干脆把新寫的 python 代碼和拷貝的 py 庫放在同一個目錄下,然后用這個目錄下提供的 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 連接確實是建立了,但是不執(zhí)行 hive 指令。也許就是版本的問題。
還是那句話,看各種中文博客不如看官方文檔。
項目中使用的 hive 版本是0.13,此時此刻官網(wǎng)的最新版本都到了1.2.1了。中間間隔了1.2.0、1.1.0、1.0.0、0.14.0。但是還是參考一下官網(wǎng)的方法試試吧。
首先看官網(wǎng)的 setting up hiveserver2
可以看到啟動 hiveserver2 可以配置更大最小線程數(shù),綁定的 IP,綁定的端口,還可以設置認證方式。(之前一直不成功正式因為這個連接方式)然后還給了 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
在拿到這個代碼的時候,自以為是的把認證信息給去掉了。然后運行發(fā)現(xiàn)跟之前博客里介紹的方法結果一樣,建立了 TCP 連接,但是就是不執(zhí)行,也不報錯。這是幾個意思?然后無意中嘗試了一下原封不動的使用上面的代碼。結果可以用。唉。。。
首先聲明一下,hive-site.xml中默認關于 hiveserver2的配置我一個都沒有修改,一直是默認配置啟動 hiveserver2。沒想到的是默認配置是有認證機制的。
然后再寫一點,在安裝 pyhs2的時候還是遇到了點問題,其實還是要看官方文檔的,我只是沒看官方文檔直接用 pip安裝導致了這個問題。安裝 pyhs2需要確定已經(jīng)安裝了幾個依賴包。直接看在 github 上的 wiki 吧。哪個沒安裝就補上哪一個就好了。
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
寫了這么多,其實是在啰嗦自己遇到的問題。下面寫一下如何使用 python
連接 hive。
python 連接 hive 是基于 thrift 完成的。所以需要服務器端和客戶端的配合才能使用。
在服務器端需要啟動 hiveserver2 服務,啟動方法有兩種, 第二種方法只是對之一種方法的封裝。
1. $HIVE_HOME/bin/hive –server hiveserver2
2. $HIVE_HOME/bin/hiveserver21212
默認情況下就是hiveserver2監(jiān)聽了10000端口。也可以通過修改 hive-site.xml 或者在啟動的時候添加參數(shù)來實現(xiàn)修改默認配置。
另外一方面,在客戶端需要安裝 python 的依賴包 pyhs2。安裝方法在上面也介紹了,基本上就是用 pip install pyhs2,如果安裝不成功,安裝上面提到的依賴包就可以了。
最后運行上面的示例代碼就可以了,配置好 IP 地址、端口、數(shù)據(jù)庫、表名稱就可以用了,默認情況下認證信息不需要修改。
另外補充一點 fetch 函數(shù)執(zhí)行速度是比較慢的,會把所有的查詢結果返回來??梢钥匆幌?pyhs2 的源碼,查看一下還有哪些函數(shù)可以用。下圖是 Curor 類的可以使用的函數(shù)。
一般 hive 表里的數(shù)據(jù)比較多,還是一條一條的讀比較好,所以選擇是喲功能 fetchone函數(shù)來處理數(shù)據(jù)。fetchone函數(shù)如果讀取成功會返回列表,否則 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”
關于hive加載gbk數(shù)據(jù)庫的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
成都服務器托管選創(chuàng)新互聯(lián),先上架開通再付費。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設,軟件開發(fā)老牌服務商!微信小程序開發(fā),APP開發(fā),網(wǎng)站制作,網(wǎng)站營銷推廣服務眾多企業(yè)。電話:028-86922220
網(wǎng)頁標題:Hive如何加載GBK編碼的數(shù)據(jù)庫 (hive加載gbk數(shù)據(jù)庫)
分享路徑:http://m.fisionsoft.com.cn/article/dpidpdp.html


咨詢
建站咨詢
