복붙노트

[HADOOP] 드롭 TABLE 문에 하이브는 ParseException

HADOOP

드롭 TABLE 문에 하이브는 ParseException

나는 하둡에 하이브 쿼리를 실행하기 위해 특히 파이썬과 pyodbc 모듈을 사용하고 있습니다. 코드 트리거링 문제의 일부는이 같다 :

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:
    sTableName = oParameterData.loc[oRow,'TableName']
    oQueryDeleteTable = 'drop table if exists my_db.' + sTableName + ';'
    print(oQueryDeleteTable)
    oCursor.execute(oQueryDeleteTable)

dl_audit_data_quality.hero_context_start_gamemode을 존재하는 경우 테이블을 삭제; 인쇄이주는

그러나 cursor.execute 다음과 같은 오류 메시지가 트리거

내가 인쇄를 복사하여 수동으로 색조를 실행할 때, 그것은 잘 작동합니다. 나는 변수 sTableName의 인코딩 함께 할 수있는 뭔가가 추측하고 있지만, 나는 그것을 해결하는 방법을 알아낼 수 없습니다.

감사

해결법

  1. ==============================

    1.쿼리는 변수 sTableName의 잘못된 인코딩으로 인해 실패했다. 혼자 변수를 인쇄하면 제대로 텍스트를 표시합니다. 위의 인쇄와 예 :

    쿼리는 변수 sTableName의 잘못된 인코딩으로 인해 실패했다. 혼자 변수를 인쇄하면 제대로 텍스트를 표시합니다. 위의 인쇄와 예 :

    >>> print(oQueryDeleteTable)
    >>> 'drop table if exists dl_audit_data_quality.hero_context_start_gamemode;'
    

    그러나 원래의 데이터 프레임은이 같은 문자를 포함 보여 주었다 인쇄 :

    >>> print(oParameterData.loc[oRow,'TableName']
    >>> 'h\x00e\x00r\x00o\x00_c\x00o\x00n\x00t\x00e\x00x\x00t\x00'
    

    여기에 설명 된대로 문제가 인코딩에 재 작업에 의해 해결되었다 : 파이썬 사전 인코딩 된 값을 포함합니다

    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')
    oQueryParameter = "select * from my_db.my_table;"
    oParameterData = pandas.read_sql(oQueryParameter, oConnexion)
    oCursor = oConnexion.cursor()
    
    for oRow in oParameterData.index:
        sTableName = oParameterData.loc[oRow,'TableName']
        oQueryDeleteTable = 'drop table if exists my_db.' + sTableName + ';'
        print(oQueryDeleteTable)
        oCursor.execute(oQueryDeleteTable)
    
  2. from https://stackoverflow.com/questions/43821098/hive-parseexception-in-drop-table-statement by cc-by-sa and MIT license