2017-05-07 3 views
3

私は、Hive ODBC接続を使用してHadoopでクエリを構築したパンダデータフレームoParameterDataを持っています。私は鍵を印刷し、それらが正しく表示一つずつ値際Python辞書にエンコードされた値が含まれています

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

しかし:私は、次のしている全体の辞書を印刷するとき、Pythonの辞書が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'] 

と呼ば移入するためにそれを使用しています:

辞書を正しくエンコードする理由と説明方法を教えてください。 ここで説明する後続のクエリでこれらのパラメータを使用しています:Hive ParseException in Drop Table Statement と私はこのエンコードの問題のためにクエリが失敗したと推測しています。

+0

これは奇妙です。すべての文字は 'x00'で区切られ、印刷時に' NUL'を表示します – JacobIRR

+0

@StephenRauch辞書全体を印刷すると、辞書の値を1つずつ印刷するときと同じように何かが読めるようになります。 –

+0

@JacobIRRええ、それは確かに奇妙ですが、値を別々に印刷すると、それらがヌルでないことがわかります –

答えて

1

さらに調査したところ、pyodbcを使用してHadoopに接続するときにエンコードが正しく設定されていないことがわかりました。

私はこのように接続された

:私はそれを正しく表示するデータフレームからの私の辞書を構築する際に今

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

import pyodbc 
import pandas 

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

私はこのように接続するように変更。

関連する問題