我希望将我的工作流程从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?
答案 0 :(得分:0)
nzalchemy在这里可以提供帮助。
pip install sqlalchemy
安装sqlalchemy unixOdbc
(yum instal unixODBC-devel
或brew install unixOdbc
.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 ',');