Drop Table 语句中的 Hive ParseException
Hive ParseException in Drop Table Statement
我正在使用 python 和 pyodbc 模块,特别是在 Hadoop 上执行 Hive 查询。代码触发问题的部分是这样的:
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)
印刷品是这样的:drop table if exists dl_audit_data_quality.hero_context_start_gamemode;
但是 cursor.execute
触发了以下错误消息
pyodbc.Error: ('HY000', "[HY000] [Cloudera][HiveODBC] (80) Syntax or
semantic analysis error thrown in server while execurint query. Error
message from server: Error while compiling statement: FAILED:
ParseException line 1:44 character ' (80) (SQLExecDirectW)")
请注意,当我复制打印并在 Hue 中手动执行时,效果很好。我猜它与变量 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)
我正在使用 python 和 pyodbc 模块,特别是在 Hadoop 上执行 Hive 查询。代码触发问题的部分是这样的:
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)
印刷品是这样的:drop table if exists dl_audit_data_quality.hero_context_start_gamemode;
但是 cursor.execute
触发了以下错误消息
pyodbc.Error: ('HY000', "[HY000] [Cloudera][HiveODBC] (80) Syntax or semantic analysis error thrown in server while execurint query. Error message from server: Error while compiling statement: FAILED: ParseException line 1:44 character ' (80) (SQLExecDirectW)")
请注意,当我复制打印并在 Hue 中手动执行时,效果很好。我猜它与变量 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)