2017-05-07 4 views
3

하이브 ODBC 연결을 사용하여 Hadoop에서 쿼리를 작성한 팬더 데이터 프레임 oParameterData가 있습니다. 나는라는 파이썬 사전을 채우기 위해 그것을 사용하고 oParameter파이썬 사전에 인코딩 된 값이 포함됨

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'} 

을하지만 키 인쇄 및 값 때 하나 하나가 제대로 표시를 :

사전을 제대로 인코딩하는 이유와 방법을 설명해주십시오. 여기에 설명 된 후속 쿼리에서이 매개 변수를 사용하고 있습니다. Hive ParseException in Drop Table Statement 이 인코딩 문제로 인해 쿼리가 실패한 것 같습니다.

+0

이것은 이상합니다. 모든 문자는'x00'으로 구분되어 인쇄 될 때'NUL'을 표시합니다. – JacobIRR

+0

@StephenRauch 사전 전체를 인쇄 할 때 사전 값을 하나씩 인쇄 할 때와 같은 방식으로 읽을 수있는 것으로 기대합니다. –

+0

@JacobIRR 네 그것은 참으로 이상합니다. 그러나 개별적으로 값을 출력 할 때 그들은 null이 아닌 것을 볼 수 있습니다. –

답변

1

더 자세히 조사한 결과, pyodbc를 사용하여 Hadoop에 연결할 때 인코딩이 올바르게 설정되지 않았다는 것을 알았습니다.

I는 다음과 같이 연결되었다

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') 

을 이제 제대로 표시하는 데이터 프레임에서 내 사전을 빌드 할 때.