繁体   English   中英

从 Pandas DataFrame 在 Netezza 上创建临时表

[英]Creating Temporary Table on Netezza from Pandas DataFrame

我希望将我的工作流程从 SAS 更改为 Python,到目前为止,除了一件非常重要的事情之外,我已经取得了相当大的成功。 我不知道如何将 Pandas DataFrames 上传到我公司的 Netezza 以用于以后的查询。 这实际上非常重要,因为我们有许多数据集可以上传并用于查询。

我有以下熊猫数据帧:

[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?

nzalchemy可以提供帮助。

  • 使用pip install sqlalchemy
  • 安装 nzalchemy
  • 对于 linux 系统,需要安装unixOdbcyum instal unixODBC-devel unixOdbc yum 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

当然,首先你需要将你的 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 ','); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM