我有一个docker图像与脚本读取iql文件,并在impala执行它。删除文件引用并运行一个简单的脚本工作良好(即SELECT 1;),但每当我尝试从文件执行脚本时,我得到一个错误
pyodbc。错误:('HY000', '[HY000] [Cloudera][ImpalaODBC](110)在Impala执行查询时出错:[HY000]: ParseException:语法错误在第2行:nn^n遇到:EOF expected: ALTER, COMMENT, COMPUTE, COPY, CREATE, DELETE, DESCRIBE, DROP, EXPLAIN, GRANT, INSERT, INVALIDATE, LOAD, REFRESH, REVOKE, SELECT, SET, SHOW, TRUNCATE, UPDATE, UPSERT, USE, VALUES, WITHn ncause BY: Exception:语法错误n (110) (SQLExecDirectW)'
我已经尝试从cloudera.impalaodbc.ini文件和各种类型的sql查询(包括更改文件扩展名为isql, iusql)中删除DriverManagerEncoding=UTF-16,但总是得到相同的错误。
任何想法?
Python功能:
def process_data_to_impala():
conn = pyodbc.connect(DSN='some_DSN', autocommit=True)
crsr = conn.cursor()
with open('/path/to/sql/file.iql','r') as inserts:
for statement in inserts:
crsr.execute(statement)
print(crsr.fetchall())
问题与python代码循环遍历语句的方式以及';'结束查询的方式有关。
对于文件中的单个查询,更好的方法是
with open('file/location.iql') as script:
statement = script.read()
print(statement)
crsr = conn.cursor()
crsr.execute(statement)
当你在一个文件中有多个查询时,你需要循环:
with open('file/location.iql') as script:
sqlscript = script.read()
for statement in sqlscript.split(';'):
print(statement)
crsr = conn.cursor()
crsr.execute(statement)
当从一个脚本读取多个查询时(例如删除表,创建表),必须从最后一个查询中删除';'。这是因为分割在最后一个';'之后创建了最后一个空白查询。
我希望这对将来的人有所帮助!