2017-05-07 40 views
3

我有一個熊貓數據框oParameterData,我已經使用Hive ODBC連接在Hadoop上構建了查詢。我使用它來填充名爲Python字典oParameterPython字典包含編碼值

import pyodbc 
import pandas 

oConnexionString = 'Driver={ClouderaHive};[...]' 
oConnexion = pyodbc.connect(oConnexionString, autocommit=True) 
oConnexion.setencoding(encoding='utf-8') 
oQueryParameter = "select * from my_db.my_table;" 
oParameterData = pandas.read_sql(oQueryParameter, oConnexion) 
oCursor = oConnexion.cursor() 

for oRow in oParameterData.index: 
    oParameter = {} 
    oParameter['pTableName'] = oParameterData.loc[oRow,'game'] 
    oParameter['pDataPartition'] = oParameterData.loc[oRow,'partition'] 
    oParameter['pDataLocation'] = oParameterData.loc[oRow,'data_path'] 
    oParameter['pAvroSchemaURL'] = oParameterData.loc[oRow,'schema_path'] 

當我打印整個字典,我有以下:

>>> print(oParameter) 
>>> {'pDataLocation': '/\x00d\x00a\x00t\x00a\x00/\x00d\x00a\x00t\x00a\x00l\x00a\x00k\x00e\x00/\x00t\x00m\x00p\x00/\x00k\x00a\x00f\x00k\x00a\x00d\x00u\x00m\x00p\x00e\x00r\x00/\x00d\x00a\x00t\x00a\x00/\x00H\x00e\x00r\x00o\x00/\x00c\x00o\x00n\x00t\x00e\x00x\x00t\x00.\x00s\x00t\x00a\x00r\x00t\x00.\x00G\x00a\x00m\x00e\x00M\x00o\x00d\x00e\x00\x00/\x00v\x00=\x001\x00.\x00x\x00', 'pAvroSchemaURL': '/\x00d\x00a\x00t\x00a\x00/\x00d\x00a\x00t\x00a\x00l\x00a\x00k\x00e\x00/\x00t\x00m\x00p\x00/\x00k\x00a\x00f\x00k\x00a\x00d\x00u\x00m\x00p\x00e\x00r\x00/\x00d\x00a\x00t\x00a\x00/\x00H\x00e\x00r\x00o\x00/\x00c\x00o\x00n\x00t\x00e\x00x\x00t\x00.\x00s\x00t\x00a\x00r\x00t\x00.\x00G\x00a\x00m\x00e\x00M\x00o\x00d\x00e\x00\x00/\x00c\x00o\x00n\x00t\x00e\x00x\x00t\x00.\x00s\x00t\x00a\x00r\x00t\x00.\x00G\x00a\x00m\x00e\x00M\x00o\x00d\x00e\x00_\x001\x00.\x00x\x00.\x00a\x00v\x00s\x00c\x00', 'pTableName': 'h\x00e\x00r\x00o\x00_c\x00o\x00n\x00t\x00e\x00x\x00t\x00', 'pDataPartition': 'd\x00t\x00'} 

但是當我打印鍵和值一個接一個,他們正確顯示:

>>> print(oParameter['pTableName']) 
>>> 'hero_game_context_gamemode' 
>>> print(oParameter['pDataPartition']) 
>>> 'dt' 

請問您能解釋爲什麼以及如何讓詞典正確編碼? 我在這裏描述的後續查詢中使用這些參數:Hive ParseException in Drop Table Statement ,我猜猜查詢失敗,由於此編碼問題。

+0

這很奇怪。每個字符都用'x00'分隔,打印時顯示'NUL' – JacobIRR

+0

@StephenRauch,當我打印整本字典時,我希望能夠像打印字典值時一樣可讀。 –

+0

@JacobIRR是的它確實是奇怪的,但是當我分別打印值時,我可以看到它們不是null –

回答

1

經過進一步調查後,我發現使用pyodbc連接到Hadoop時編碼設置不正確。

我連這樣的:

import pyodbc 
import pandas 

oConnexionString = 'Driver={ClouderaHive};[...]' 
oConnexion = pyodbc.connect(oConnexionString, autocommit=True) 
oConnexion.setencoding(encoding='utf-8') 

我改變象這樣連接:

import pyodbc 
import pandas 

oConnexionString = 'Driver={ClouderaHive};[...]' 
oConnexion = pyodbc.connect(oConnexionString, autocommit=True) 
oConnexion.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') 
oConnexion.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8') 
oConnexion.setencoding(encoding='utf-8') 

現在,當我建立我的字典從它會顯示正確的數據幀。