2017-05-07 103 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') 

现在,当我建立我的字典从它会显示正确的数据帧。