Создание временной таблицы в Netezza из Pandas DataFrame

Я хочу изменить свой рабочий процесс с SAS на Python, и до сих пор был довольно успешным, за исключением одной довольно большой вещи. Я не могу понять, как загрузить Pandas DataFrames в Netezza моей компании для использования в последующих запросах. На самом деле это очень важно, поскольку у нас есть много наборов данных, которые мы загружаем и используем для запросов.

У меня есть следующие панды DataFrame:

[In ]  df
[Out]
       col1  col2  col3  
    0     1     2     3
    1     4     5     6
    2     7     8     9

Я хотел бы загрузить этот DataFrame в свой ящик Netezza через соединение ODBC. Соединение уже настроено следующим образом:

import pyodbc
conn = pyodbc.connect("Driver=NetezzaSQL;Server=...;")

Я использовал это соединение в сочетании с Pandas read_sql для извлечения данных и сохранения их в DataFrame. Однако я еще не понял, как извлечь данные. В SAS я бы сделал следующее:

proc sql _method;
connect to netezza as net_dw
(auth domain info goes here...)
execute( create temporary table my_table
                                ( col1   int,
                                  col2   int,
                                  col3   int ) distribute on (col1) by net_dw)

insert into temp.my_table
select col1, col2, col3 from work.my_table;
quit;

Я попробовал следующее, используя Pandas:

t = pd.read_sql('''create temporary table test1 (col1 int, col2 int, col3 int); insert into temp.test1 select * from df''', conn)

но получил TypeError: 'NoneType' object is not iterable.

Можно ли загружать временные таблицы в Netezza с помощью pyodbc и Pandas?


person invoker    schedule 17.08.2015    source источник


Ответы (2)


Здесь может помочь nzalchemy.

  • Установите sqlalchemy с помощью pip install sqlalchemy
  • Установите nzalchemy
  • Для систем Linux требуется установка unixOdbc (yum instal unixODBC-devel или brew install unixOdbc
  • Метод DataFrame .to_sql можно использовать для перемещения фреймов данных непосредственно в Netezza в виде таблицы.
from sqlalchemy import create_engine
from urllib import parse_quote_plus

# assumes NZ_HOST, NZ_USER, NZ_PASSWORD are set
import os

params = parse_quote_plus(f"DRIVER=NetezzaSQL;SERVER={os['NZ_HOST']};"
            f"DATABASE={os['NZ_DATABASE']};USER={os['NZ_USER']};"
            f"PASSWORD={os['NZ_PASSWORD']}")
engine = create_engine(f"netezza+pyodbc:///?odbc_connect={params}", 
            echo=True)

# assuming df to be a dataframe
df.to_sql('users', con=engine)
engine.execute("SELECT * FROM users").fetchall()

Сведения об API — DataFrame .to_sql

person Aniket Kulkarni    schedule 26.09.2020

Конечно, сначала вам нужно записать свой DataFrame в плоский файл. Я думаю, у панд есть метод создайте csv. Затем вызовите временную внешнюю таблицу, как показано ниже.

create temporary table my_table
                                ( col1   int,
                                  col2   int,
                                  col3   int ) distribute on (col1) by net_dw)

insert into temp.my_table
select col1, col2, col3 from EXTERNAL 'FULL FILE PATH'
sameas my_table
using (REMOTESOURCE 'ODBC' delim ','); 
person Niederee    schedule 17.08.2015
comment
У меня есть несколько вопросов: 1) Все это внутри команды pyodbc.cursor.execute() или я могу как-то использовать это с Pandas? 2) что такое УДАЛЕННЫЙ ИСТОЧНИК? - person invoker; 17.08.2015