从Pandas DataFrame在Netezza上创建临时表

时间:2015-08-17 14:53:35

标签: python sql pandas odbc netezza

我希望将我的工作流程从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

我想通过ODBC连接将此DataFrame上传到我的Netezza盒子。连接已设置如下:

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

是否可以使用pyodbc和Pandas将临时表上传到Netezza?

2 个答案:

答案 0 :(得分:0)

nzalchemy在这里可以提供帮助。

  • 使用pip install sqlalchemy安装sqlalchemy
  • Install nzalchemy
  • 对于Linux系统,需要安装unixOdbcyum instal unixODBC-develbrew 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

答案 1 :(得分:-1)

首先你需要把你的DataFrame写成一个平面文件我认为pandas有一个方法build a 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 ',');