【问题标题】:Creating Temporary Table on Netezza from Pandas DataFrame从 Pandas DataFrame 在 Netezza 上创建临时表
【发布时间】:2015-11-10 06:37:37
【问题描述】:

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

【问题讨论】:

    标签: python sql pandas odbc netezza


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我有几个问题:1) 所有这些都在pyodbc.cursor.execute() 命令中,还是我可以以某种方式将它与 Pandas 一起使用? 2)什么是REMOTESOURCE?
      猜你喜欢
      • 1970-01-01
      • 2019-07-08
      • 2016-09-22
      • 1970-01-01
      • 2021-11-26
      • 2017-09-28
      • 2016-03-15
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多