Python 将新列从另一个表连接到redshift/sql表

Python 将新列从另一个表连接到redshift/sql表,python,sql,pandas,amazon-web-services,amazon-redshift,Python,Sql,Pandas,Amazon Web Services,Amazon Redshift,我是sql/redshift新手,正在寻找合并到表的最佳方法 我有一张红移的大桌子,大约2k cols乘50k行。该表有一个datetime sortkey。我在python/pandas数据框架中迭代地将sortkey和另外一列拉入其中,执行一些相当复杂的操作来生成新的列。然后,我将这个数据帧转换为另一个红移表,我想将它与原始表合并,以便只追加新的列,尽管如果整个内容都更新了,这并不重要。两个表都有相同的sortkey,这应该相当简单,对吗?基本上只是添加一些新的专栏?请原谅我的天真 表1 d

我是sql/redshift新手,正在寻找合并到表的最佳方法

我有一张红移的大桌子,大约2k cols乘50k行。该表有一个datetime sortkey。我在python/pandas数据框架中迭代地将sortkey和另外一列拉入其中,执行一些相当复杂的操作来生成新的列。然后,我将这个数据帧转换为另一个红移表,我想将它与原始表合并,以便只追加新的列,尽管如果整个内容都更新了,这并不重要。两个表都有相同的sortkey,这应该相当简单,对吗?基本上只是添加一些新的专栏?请原谅我的天真

表1

datetime, rainfall, windspeed, cloudcover
2000-01-01,5,5,5
2000-01-02,7,5,5
2000-01-03,1,5,5
2000-01-04,0,5,5
pandasdf1

datetime, rainfall, rainfall_movingAverage, other_calculation
2000-01-01,5,5,NaN
2000-01-02,7,6,4.56
2000-01-03,1,4.3,7.53
2000-01-04,0,3.75,3.55
以下是我想要实现的目标:

datetime, rainfall, windspeed, cloudcover,rainfall_movingAverage, other_calculation
2000-01-01,5,5,5,5,NaN
2000-01-02,7,5,5,6,4.56
2000-01-03,1,5,5,4.3,7.53
2000-01-04,0,5,5,3.75,3.55
在熊猫中,这非常简单,可以通过多种方式实现,其中一种方式是:

result = pd.concat([table1, pandasdf1], axis=1, sort=True)
然而,数据帧的大小正在使pandas崩溃,数据将变得比现在大得多,因此我不得不将其迁移到redshift。我已尝试使用以下命令进行合并:

SELECT * FROM table1
FULL OUTER JOIN pandasdf ON (table1.datetime = pandasdf.datetime)
SELECT * FROM table1
FULL OUTER JOIN pandasdf ON (table1.datetime = pandasdf.datetime)
这似乎是可行的,至少不会崩溃或返回错误,但原始表不会更新。我似乎找不到只更新原始表的附加语法。值得注意的是,我正在使用python sql引擎与红移进行交互

import psycopg2
SQL="""
SELECT * FROM table1
FULL OUTER JOIN pandasdf ON (table1.datetime = pandasdf.datetime)
"""
def merge_redshift_tables(SQL):
    """merge the left and right tables"""
    success=False
    try:
        conn=None
        """Establish a connection to redshift"""
        conn=psycopg2.connect(dbname= 'mydb', host='myIP', port= 'myport', user= 'myusername', password= 'mypassword')
        """make a cursor object"""
        cur = conn.cursor()       
        cur.execute(SQL)
        success=True
    except psycopg2.Error as e:
        print(e)
    finally:
        if conn is not None:
            conn.close()

    return success
如果有人能帮我完成这一步,那将是伟大的第一步。然而,我不确定这是否是对~2000列中的每一列进行此类操作的最佳方式,因此如果有人能分享一些关于最佳实践的智慧,那么我也会非常感激。我曾粗略地计划将工作分配到多个并行工作的计算节点上,但这取决于红移能否平滑地合并所有这些新列,我知道这可能是一个问题。欢迎就这方面的最佳做法提出任何建议

非常感谢

编辑 以下运行时似乎没有出现任何错误,表明已成功创建包含所需列的新表:

SELECT t1.*, t2.new_col
INTO TABLE combined FROM table1 t1
LEFT JOIN pandasdf1 t2 ON t1.datetime = t2.datetime;
但是,当我查询时,它返回一个错误,表明没有新表:

def get_col(table, col='*'):
    """Gets all data from a column from a table"""
    coldata=None
    try:
        conn=None
        """Establish a connection to redshift"""
        conn=psycopg2.connect(dbname= 'mydb', host='myIP', port= 'myport', user= 'myusername', password= 'mypassword')
        coldata = pd.read_sql("select {} FROM {}".format(col, table), conn).set_index('gmt_reportedtime').dropna()
    except psycopg2.Error as e:
        print(e)
    finally:
        if conn is not None:
            conn.close()
    return coldata

check = get_col('combined')
返回:

pandas.io.sql.DatabaseError: Execution failed on sql 'select * FROM combined': relation "combined" does not exist
编辑 我现在已经修好了!使用python语句,需要提交的更改如下:

conn.commit()

您可以使用以下命令确认原始表未更新:

SELECT * FROM table1
FULL OUTER JOIN pandasdf ON (table1.datetime = pandasdf.datetime)
SELECT * FROM table1
FULL OUTER JOIN pandasdf ON (table1.datetime = pandasdf.datetime)
SQL中的SELECT命令返回数据。它不会更新数据

如果希望创建新的组合表,可以使用:

SELECT *
INTO TABLE combined
FROM table1
JOIN pandasdf ON (table1.datetime = pandasdf.datetime)
见:


您需要使用新表,因为原始表1仅定义为具有原始的4列。虽然您可以修改表,添加列,然后运行UPDATE命令,但创建一个新表对于Amazon Redshift来说是一个更好的主意,而且效率更高。

为什么有这么多列?你能/应该将COL转为行吗?这只是数据的大小,只是为了提供一些背景信息,我更习惯于使用数据帧而不是数据库,我感觉它们之间有着本质上的区别?不是根本上的区别,但是通常会对表进行规范化,特别是当您有col1 col2 col3 col4等时-您将创建一个新列和数据透视您能解释一下规范化的含义吗?您能共享表中的列的名称吗?我可以以此为例。感谢您的帮助,这似乎是我需要做的,但它给了我一个错误:pandas.io.sql.DatabaseError:sql'select*FROM combined'上的执行失败:组合关系不存在。是否有一种方法可以在填充表的同时动态创建表?当我尝试取回“组合”表时,会出现上述错误。上面的命令返回以下错误:psycopg2.ProgrammingError:relationcombined不存在,您是否正在提交或自动提交更改?请参阅:再次感谢您的帮助,python代码中有一个no-commit语句导致了错误,commit或autocommit都可以使它工作。