从Pandas DataFrame在Netezza上创建临时表

5

我想把从SAS到Python的工作流程转换,迄今为止已经相当成功,除了一件非常重要的事情。 我无法弄清楚如何将 Pandas 数据帧上传到我们公司的 Netezza,以供稍后查询使用。这实际上非常重要,因为我们有许多数据集需要上传并用于查询。

我有以下 Pandas 数据帧:

[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个回答

1

nzalchemy 可以在这里提供帮助。

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

(保留HTML)

-1

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

1
我有几个问题:
  1. 这些都在 pyodbc.cursor.execute() 命令之内吗?或者我可以以某种方式与 Pandas 一起使用它?
  2. REMOTESOURCE 是什么?
- invoker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接