Я новичок в 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()