繁体   English   中英

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

[英]join new columns to redshift/sql table from another table

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

我在redshift中有一张大的(ish)表(大约2k列乘5万行)。 该表具有日期时间排序键。 我将sortkey和其他1列迭代拉入python / pandas数据帧中,执行一些(相当复杂的)生成新列的操作。 然后,我将此熊猫数据帧转换为另一个redshift表,并希望将其与原始表合并,以便仅附加新列(尽管如果整个内容都进行了更新,这并不重要)。 两个表都具有相同的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)

但是,数据帧的大小使大熊猫崩溃,并且数据将变得比原来大得多,因此我不得不将其迁移到redshift。 我尝试使用以下命令进行合并:

SELECT * FROM table1
FULL OUTER JOIN pandasdf ON (table1.datetime = pandasdf.datetime)

这似乎可行(它不会崩溃或至少不会返回错误),但是原始表未更新。 我似乎找不到其他语法来更新原始表。 值得注意的是,我正在使用python sql引擎与redshift进行交互

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列中的每一列进行此类操作的最佳方法,因此,如果有人可以分享有关最佳实践的一些知识,那么我也将非常感谢。 我曾计划将工作分配到多个并行工作的计算节点上,但是这取决于能否平稳地合并所有这些新列的redshifts能力(我知道这可能是个问题)。 非常欢迎您提供有关此领域最佳实践的任何建议。

非常感谢

#####编辑

以下内容似乎没有任何错误,提示成功创建了具有所需列的新表:

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

收益:

conn.commit()
编辑

我现在已经解决了! 使用python语句,需要提交更改:

 conn.commit() 

您可以使用以下命令“原始表未更新”:

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)

请参阅: SELECT INTO-Amazon Redshift

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

暂无
暂无

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

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