3

Я столкнулся с этим вопросом вчера, пытаясь использовать тот же скрипт sqlite, который я использовал в модуле «Применить SQL Transformation» в Azure ML, в SQLite через модуль Python в Azure ML:Azure ML в модуле «Execute Python Script»: общие выражения таблиц не поддерживаются в sqlite3

with tbl as (select * from t1) 
select * from tbl 

Здесь ошибка я получил:

[Critical]  Error: Error 0085: The following error occurred during script evaluation, please view the output log for more information: 
---------- Start of error message from Python interpreter ---------- 
    File "C:\server\invokepy.py", line 169, in batch 
data:text/plain,Caught exception while executing function: Traceback (most recent call last): 
    odfs = mod.azureml_main(*idfs) 
    File "C:\pyhome\lib\site-packages\pandas\io\sql.py", line 388, in read_sql 
    File "C:\temp\azuremod.py", line 193, in azureml_main 
    results = pd.read_sql(query,con) 
    coerce_float=coerce_float, parse_dates=parse_dates) 
    File "C:\pyhome\lib\site-packages\pandas\io\sql.py", line 1017, in execute 
    File "C:\pyhome\lib\site-packages\pandas\io\sql.py", line 1022, in read_sql 
    cursor = self.execute(*args) 
    raise_with_traceback(ex) 
    File "C:\pyhome\lib\site-packages\pandas\io\sql.py", line 1006, in execute 
---------- End of error message from Python interpreter ---------- 
    cur.execute(*args) 
DatabaseError: Execution failed on sql: with tbl as (select * from t1) 
        select * from tbl 

и код Python:

def azureml_main(dataframe1 = None, dataframe2 = None): 
    import pandas as pd 
    import sqlite3 as lite 
    import sys 
    con = lite.connect('data1.db') 
    con.text_factory = str 
    with con: 
     cur = con.cursor() 

     if (dataframe1 is not None): 
      cur.execute("DROP TABLE IF EXISTS t1") 
      dataframe1.to_sql('t1',con) 
     query = '''with tbl as (select * from t1) 
        select * from tbl'''      
     results = pd.read_sql(query,con)  

    return results, 

при замене запроса с:

select * from t1 

Он работал, как ожидалось. Как вы, вероятно, знаете, общие выражения таблиц являются ключевой особенностью Sqlite, возможность запуска рекурсивного кода «должна иметь» на любом функциональном языке, таком как Sqlite.

Я также пытался запустить свой сценарий Python в ноутбуке Jupyter в Azure, который также работал, как ожидалось.

Возможно ли, что у нас есть другая конфигурация для Sqlite в модуле Python, чем в Jupyter Notebook и в модуле «Применить SQL Transformation»?

+0

Дешевый ни один ответ заключается в том, чтобы попытаться добавить конкретную версию sqllite3, которую вы хотели бы, вот руководство. http://blogs.msdn.com/b/andreasderuiter/archive/2015/02/16/azure-ml-now-apparently-supports-executing-python-scripts.aspx, но я также на самом деле не вижу sqllite3 на этом list ... Очень возможно, что версии ноутбуков и модулей не синхронизированы. –

ответ

2

Я воспроизвел вашу проблему и рассмотрел документ SQL Queries от pandas.io.sql по адресу http://pandas.pydata.org/pandas-docs/stable/io.html#sql-queries. Я попытался использовать read_sql_query, чтобы решить проблему, но не смог.

Согласно документу pandas, tt кажется, что Pandas не поддерживает использование этого синтаксиса SQL.

Основываясь на моем опыте и в соответствии с вашим SQL, я попытался выполнить SQL select * from (select * from t1) as tbl вместо вашего SQL, который работает для Pandas.

Надеюсь, это поможет. С наилучшими пожеланиями.