присоединить новые столбцы к таблице красного смещения / sql из другой таблицы - PullRequest
0 голосов
/ 05 марта 2019

Я новичок в sql / redshift и ищу лучший способ объединения таблиц.

У меня есть большая (ish) таблица с красным смещением (около 2 тысяч столбцов на 50 тысяч строк). В таблице есть ключ даты и времени. Я итерационно добавляю sortkey и 1 другой столбец в фрейм данных Python / Pandas, выполняя некоторые (довольно сложные) операции, которые генерируют новые столбцы. Затем я преобразую этот кадр данных pandas в другую таблицу красного смещения, и я хотел бы объединить его с исходной таблицей, чтобы добавлялись только новые столбцы (хотя на самом деле это не имело бы значения, если все это было обновлено). Обе таблицы имеют один и тот же ключ сортировки, это должно быть довольно просто, верно? Просто добавить несколько новых столбцов? (прошу прощения за мою наивность)

table1

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)

Однако размер фреймов данных приводит к сбою панд, и данные станут намного больше, чем уже есть, поэтому мне пришлось перенести их в красное смещение. Я попытался объединить с помощью этой команды:

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()

1 Ответ

1 голос
/ 06 марта 2019

Вы можете, чтобы «исходная таблица не обновлялась» с помощью этой команды:

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

Команда SELECT в SQL возвращает данные . не обновляет данные.

Если вы хотите создать новую комбинированную таблицу, вы можете использовать:

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

См .: ВЫБРАТЬ В - Amazon Redshift

Вам необходимо использовать новую таблицу, потому что «оригинал» table1 определяется только как имеющий четыре исходных столбца. Хотя вы можете изменить таблицу, добавить столбцы и затем выполнить команду UPDATE, создание новой таблицы является гораздо лучшей идеей (и более эффективной для Amazon Redshift).

...