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

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

Имам следните pandas 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
  • Методът .to_sql на DataFrame може да се използва за преместване на рамки с данни директно в 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 в плосък файл. Мисля, че pandas има метод за създаване на 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) какво е REMOTESOURCE? - person invoker; 17.08.2015